TypeScript 中的联合类型——我能做到吗?

Union types in TypeScript - can I achieve this?

我想实现以下目标:

class MyClass {    
  boolProp: boolean;  
}

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

最后一行抛出错误,因为 typescript 就是这样工作的。

我可以在没有 typeguards 的情况下无错误地实现上述目标吗? 我只是想能够告诉编译器某个变量是类型 a 或 b,所以它应该认为它是 'real' both 类型属性和方法的联合,不仅仅是常见的。

我熟悉其他语言的此类行为,并且根据我的口味,这似乎是对打字稿的功能请求。

我是不是漏掉了什么?

您希望补充类型联合,type intersection

class MyClass {    
  boolProp: boolean;  
}

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

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

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

If we have a value that has a union type, we can only access members that are common to all types in the union

在运行时,您需要检查特定值是 string 还是 MyClass 以了解 boolProp 是否是所述值的 属性,并且这就是类型保护发挥作用的地方。

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

type MyString = string & { boolProp: boolean };

然后就可以这样使用了:

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

这样您就可以区分具有 boolProp 和不具有 boolProp 的字符串实例。