2016-04-29 68 views

回答

3

User-defined type guardsinstanceof type guards不窄类型是any(包括unionintersection类型的any)。

,将在型保护缩小的any唯一使用typeof检查和检查原始stringbool,和number

var something: any; 
if (typeof something === "string") 
{ 
    something.NonExistant(); // <- Error, does not exist on `string` 
    something.substr(0, 10); // <- Ok 
} 

的其它通用的typeof值,functionobjectundefined,不缩小any如果有人试图像上面的例子那样使用它们。

还有一个open issue,可以将any缩小到用户定义的类型警卫中的基元,并在TS 2.0上达到里程碑。

这是一种有意识的design decision而不是一个错误

的主要动机似乎是这种类型,守着一个类型通常缩小可能的类型,我们可以访问更多的属性,我们可以肯定的存在于选中的上下文中。但是在类型守护专用any的情况下,我们已经可以访问所有可能存在的成员,因此在您的示例中使用any进行类型守护实际上会限制我们。

另一个动机似乎也有too much crappy code那里会打破如果TypeScript缩小any的就像其他类型。

解决方法

如果你有一个变量,它可以是任意类的实例,使用类型Object,而不是any和预期型防护会工作。