联合类型(函数| RegExp)的类型保护不起作用

时间:2015-09-18 03:34:19

标签: typescript

此代码似乎导致编译错误(使用TypeScript 1.6.2检查):

var a: ((input: any) => boolean) | string | RegExp = "foobar";
if (typeof a === 'function') {
    a(100); // compile error here
}

编译器说error TS2349: Cannot invoke an expression whose type lacks a call signature.

我在TS Playground中输入了这个,发现a在if子句中有一个类型((input: any) => boolean) | RegExp,这不是我的预期。当然typeof /abc/会返回'object',所以我认为a永远不应该是if子句中的正则表达式。

我想这与this issue和“积极的子类型减少”有某种关系,但我不确定。

显式类型断言((<Function>a)(100))没有解决我的问题。有快速的解决方法吗?

编辑:更新了问题,因为事实证明这不是特定于1.6的问题。

1 个答案:

答案 0 :(得分:4)

编辑:在TS 2.0+中使用typeof在函数上键入保护。这不再是一个问题。

正如下面的问题所指出的,当前支持的方式是使用instanceof ...

var a: ((input: any) => boolean) | string | RegExp = "foobar";

if (a instanceof Function) {
    a(100); // ok
}

但是,#4868中有关于支持使用typeof的一些新讨论。

原始答案

你所说的对我来说似乎是个错误。

现在,您可以使用用户定义的类型保护:

function isFunction(obj: any) : obj is Function {
    return typeof obj === "function";
}

if (isFunction(a)) {
    a(10);
}

或者断言为任何类型,然后断言为函数的类型:

(a as any as (input: any) => boolean)(100);

我已打开问题#4850来查询此事。