我想实现以下目标:
class MyClass {
boolProp: boolean;
}
let a: string | MyClass;
a.boolProp = false; // error
最后一行会引发错误,因为这就是打字稿的工作方式。
我可以在没有错误但没有打字机的情况下实现上述目标吗? 我只是想告诉编译器某个变量是a或b类型,所以它应该认为它是两个类型属性和方法的“真正”联合,而不仅仅是常见的那些。
我熟悉其他语言的这种行为,根据我的喜好,这似乎是打字稿的功能要求。
我错过了什么吗?
答案 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
的字符串实例和不具有实例的字符串实例。