Typescript 联合类型(函数| RegExp)的类型保护不起作用
此代码似乎导致编译错误(使用TypeScript 1.6.2检查): 编译器说Typescript 联合类型(函数| RegExp)的类型保护不起作用,typescript,Typescript,此代码似乎导致编译错误(使用TypeScript 1.6.2检查): 编译器说错误TS2349:无法调用类型缺少调用签名的表达式。 我在TS游乐场中输入了这个,发现a在if子句中有一个类型((输入:any)=>boolean)| RegExp,这不是我所期望的。当然typeof/abc/返回'object',所以我认为a永远不应该是if子句中的正则表达式 我想这可能与“积极的亚型减少”有关,但我不确定 显式类型断言((a)(100))没有解决我的问题。有没有快速的解决办法 编辑:更新了问题,因为
错误TS2349:无法调用类型缺少调用签名的表达式。
我在TS游乐场中输入了这个,发现a
在if子句中有一个类型((输入:any)=>boolean)| RegExp
,这不是我所期望的。当然typeof/abc/
返回'object'
,所以我认为a
永远不应该是if子句中的正则表达式
我想这可能与“积极的亚型减少”有关,但我不确定
显式类型断言((a)(100)
)没有解决我的问题。有没有快速的解决办法
编辑:更新了问题,因为这不是1.6版本的特定问题。编辑:使用TS 2.0+中的
typeof
工作在函数上键入防护。这应该不再是一个问题
正如在下面的问题中指出的,当前支持的方法是使用instanceof
var a: ((input: any) => boolean) | string | RegExp = "foobar";
if (a instanceof Function) {
a(100); // ok
}
但是,在中有一些关于支持使用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);
我已经打开了一期来询问这一点。谢谢,我想我暂时使用双类型断言。(但我想知道为什么它能工作……这是其他地方描述的一种众所周知的技术吗?@naruto这是1.6中的一个新特性。我不知道为什么它能工作,而不是常规类型的守卫。我们来看看他们在这期杂志上怎么说。
(a as any as (input: any) => boolean)(100);