User-defined type guards和instanceof
type guards不窄类型是any
(包括union和intersection类型的any
)。
,将在型保护缩小的any
唯一使用typeof
检查和检查原始string
,bool
,和number
:
var something: any;
if (typeof something === "string")
{
something.NonExistant(); // <- Error, does not exist on `string`
something.substr(0, 10); // <- Ok
}
的其它通用的typeof值,function
,object
和undefined
,不缩小any
如果有人试图像上面的例子那样使用它们。
还有一个open issue,可以将any
缩小到用户定义的类型警卫中的基元,并在TS 2.0上达到里程碑。
这是一种有意识的design decision而不是一个错误
的主要动机似乎是这种类型,守着一个类型通常缩小可能的类型,我们可以访问更多的属性,我们可以肯定的存在于选中的上下文中。但是在类型守护专用any
的情况下,我们已经可以访问所有可能存在的成员,因此在您的示例中使用any
进行类型守护实际上会限制我们。
另一个动机似乎也有too much crappy code那里会打破如果TypeScript缩小any
的就像其他类型。
解决方法
如果你有一个变量,它可以是任意类的实例,使用类型Object
,而不是any
和预期型防护会工作。