在TypeScript中,我正在尝试为一个函数创建类型保护,该保护允许类型参数T
为不是 Function
的任何类型,如下所示:< / p>
type Thunk<T> = (() => T) | T;
function unthunk<T extends Exclude<any, Function>>(x: Thunk<T>): T
{
if (typeof x === "function") return x();
return x;
}
但是我收到此错误:
TS2349 无法调用类型缺少呼叫签名的表达式。输入'(()=> T)| (T&Function)”没有兼容的呼叫签名。
如何获得预期的结果?我正在使用TypeScript 3.4。
编辑::看来typeof x === "function"
引起了错误,我可以通过简单地投射x
来解决。但是,类型防护仍然不起作用:
function unthunk<T extends Exclude<any, Function>>(x: Thunk<T>): T
{
if (typeof x === "function") return (x as () => T)();
return x;
}
unthunk<() => number>(() => () => 3); // there should be an error here but there is none
答案 0 :(得分:1)
函数重载不会做你想要的
function unthunk<T>(x: () => T extends Function ? never : T): T;
function unthunk<T>(x: T extends Function ? never : T): T;
function unthunk<T>(x: T): T {
if (typeof x === 'function') {
return x();
}
return x;
}
const a = unthunk(1);
const b = unthunk(() => 1);
const c = unthunk(() => () => 1);