为什么TypeScript不会缩小此类型保护中的任何类型?

时间:2016-04-29 14:17:10

标签: typescript

以下示例让我感到困惑:

class MyClass
{
    public MyProp = "";
}

var object: any = null;

if (object instanceof MyClass)
    console.log(object.MyProp, object.NonExistant); // <-- No error, no intellisense

为什么类型守卫在检查的上下文中没有给我正确的类型?

1 个答案:

答案 0 :(得分:3)

User-defined type guardsinstanceof type guards不会缩小any的类型(包括any的{​​{3}}和union类型。

唯一能缩小类型后卫any的方法是使用typeof检查并检查原始stringbool和{{1} }:

number

其他通用类型的值var something: any; if (typeof something === "string") { something.NonExistant(); // <- Error, does not exist on `string` something.substr(0, 10); // <- Ok } functionobject,如果尝试使用它们,则不会缩小undefined

还有一个intersection,可以将any缩小为用户定义的类型保护中的原语,在TS 2.0中具有里程碑意义。

这是一个有意识的open issue,而不是一个错误

主要动机似乎是类型保护类型通常会缩小可能的类型,并且我们可以访问更多属性,我们可以确定它们存在于已检查的上下文中。但是在使用类型保护特殊any的情况下,我们已经可以访问可能存在的所有成员,因此在any上进行类型保护就像您在示例中所预期的那样实际上会限制我们。

另一个动机似乎也是design decision,如果TypeScript像其他类型一样缩小any,那么就会破坏。

解决方法

如果您有一个可以是任意类的实例的变量,请使用类型any而不是Object,类型保护将按预期工作。