类型防护:除特定类型外的所有类型

时间:2019-03-31 20:52:42

标签: typescript

在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

1 个答案:

答案 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);

Playground