此代码似乎导致编译错误(使用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的问题。
答案 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来查询此事。