我正在尝试使用泛型和类型推断来键入 Typescript 函数。
这很好用:
const run= <TReturn>(param: { func: () => TReturn }): TReturn => {
return param.func();
};
const result = run({ func: () => 1 }); // result: number
但是,将
param
设为联合类型会导致打字稿失效,并且无法推断出 TReturn
const run = <TReturn>(
param: () => TReturn | { func: () => TReturn }
): TReturn => {
return typeof param === 'object'
? (param as { func: () => TReturn }).func()
: (param as () => TReturn)();
};
const result1 = run(() => 1); // result1: number
const result2 = run({ func: () => 1 }); // Errors!
// Errors:
// Argument of type '{ run: () => number; }' is not assignable to parameter of type '() => unknown'.
// Object literal may only specify known properties, and 'run' does not exist in type '() => unknown'.ts(2345)
我知道我可以使用函数重载来做到这一点。
这可以在没有函数重载的情况下实现吗?如果是,如何?
这会起作用。请注意联合中第一个类型周围添加的括号。
const run = <T>(
param: (() => T) | { func: () => T }
) => {
if (typeof param === 'function') {
return param()
}
return param.func()
};
const result1 = run(() => 1); // result1: number
const result2 = run({ func: () => 1 });