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
的字符串实例。
我想实现以下目标:
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
的字符串实例。