Я создаю пример функции, которая принимает функцию fn1 в качестве аргумента и возвращает функцию fn2;
type Values<T> = (values: T) => Promise<void>; //function with argument
type NoValues = () => Promise<void>; //function without arguments
type Func1<T> = Values<T> | NoValues;
let example = function <T, R extends Func1<T> = Func1<T>>(fn1: R) {
const fn2 = async (values: R extends Values<T> ? T : void) => {
await fn1(values);
}
return fn2;
}
fn1 должен принимать один необязательный аргумент. В зависимости от того, имеет ли fn1 необязательный аргумент, он также должен быть у fn2. Таким образом, если у fn1 НЕТ аргументов, то у fn2 их тоже не должно быть, и наоборот.
Я пробовал писать такие ограничения разными способами, но все никак не получается. Буду рад, если мне кто-нибудь поможет.
interface IExample {
whatever: string;
}
const test1_fn1 = async () => console.log("");
const test1_fn2 = example<IExample>(test1_fn1);
test1_fn2() //Should work, but does not. Expected 1 argument. Not intended
const test2_fn1 = async (values: IExample) => console.log(values);
const test2_fn2 = example<IExample>(test2_fn1);
test2_fn2() //Should not work, does not work, as intended
test2_fn2({whatever: ""}) //Should work, works, as intended
Версия TS: 3.8.3. Вот площадка