以下示例让我感到困惑:
class MyClass
{
public MyProp = "";
}
var object: any = null;
if (object instanceof MyClass)
console.log(object.MyProp, object.NonExistant); // <-- No error, no intellisense
为什么类型守卫在检查的上下文中没有给我正确的类型?
答案 0 :(得分:3)
User-defined type guards和instanceof
type guards不会缩小any
的类型(包括any
的{{3}}和union类型。
唯一能缩小类型后卫any
的方法是使用typeof
检查并检查原始string
,bool
和{{1} }:
number
其他通用类型的值var something: any;
if (typeof something === "string")
{
something.NonExistant(); // <- Error, does not exist on `string`
something.substr(0, 10); // <- Ok
}
,function
和object
,如果尝试使用它们,则不会缩小undefined
。
还有一个intersection,可以将any
缩小为用户定义的类型保护中的原语,在TS 2.0中具有里程碑意义。
这是一个有意识的open issue,而不是一个错误
主要动机似乎是类型保护类型通常会缩小可能的类型,并且我们可以访问更多属性,我们可以确定它们存在于已检查的上下文中。但是在使用类型保护特殊any
的情况下,我们已经可以访问可能存在的所有成员,因此在any
上进行类型保护就像您在示例中所预期的那样实际上会限制我们。
另一个动机似乎也是design decision,如果TypeScript像其他类型一样缩小any
,那么就会破坏。
解决方法强>
如果您有一个可以是任意类的实例的变量,请使用类型any
而不是Object
,类型保护将按预期工作。