TypeScript中的联合类型 - 我能实现这一目标吗?

时间:2017-01-23 07:01:01

标签: typescript typescript-typings

我想实现以下目标:

class MyClass {    
  boolProp: boolean;  
}

let a: string | MyClass;
a.boolProp = false; // error

最后一行会引发错误,因为这就是打字稿的工作方式。

我可以在没有错误但没有打字机的情况下实现上述目标吗? 我只是想告诉编译器某个变量是a或b类型,所以它应该认为它是两个类型属性和方法的“真正”联合,而不仅仅是常见的那些。

我熟悉其他语言的这种行为,根据我的喜好,这似乎是打字稿的功能要求。

我错过了什么吗?

2 个答案:

答案 0 :(得分:5)

您希望补语输入联盟type intersection

class MyClass {    
  boolProp: boolean;  
}

let a: string & MyClass;
a.boolProp = false; // no error

类型联盟宣布变量是一种或另一种类型,因此您可以可靠访问的唯一属性是两者共有的属性。类型交集宣布变量满足两种类型的契约,因此您可以访问属于其任一组件类型的属性 - 这就是您想要的。

答案 1 :(得分:3)

根据定义,联盟类型仅包含common properties

  

如果我们有一个具有联合类型的值,我们只能访问成员   这对于联合中的所有类型都是通用的

在运行时,您需要检查特定值是string还是MyClass,以了解boolProp是否为所述值的属性,并且'防护罩开始行动的地方。

如果您在代码中为boolProp个实例创建string属性,那么您最好执行以下操作:

type MyString = string & { boolProp: boolean };

然后你可以像这样使用它:

let a: MyString | MyClass;
a.boolProp = false; // works

通过这种方式,您可以区分具有boolProp的字符串实例和不具有实例的字符串实例。