Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 联合类型(函数| RegExp)的类型保护不起作用_Typescript - Fatal编程技术网

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

Typescript 联合类型(函数| RegExp)的类型保护不起作用,typescript,Typescript,此代码似乎导致编译错误(使用TypeScript 1.6.2检查): 编译器说错误TS2349:无法调用类型缺少调用签名的表达式。 我在TS游乐场中输入了这个,发现a在if子句中有一个类型((输入:any)=>boolean)| RegExp,这不是我所期望的。当然typeof/abc/返回'object',所以我认为a永远不应该是if子句中的正则表达式 我想这可能与“积极的亚型减少”有关,但我不确定 显式类型断言((a)(100))没有解决我的问题。有没有快速的解决办法 编辑:更新了问题,因为

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

编译器说
错误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);