我想你在找
&
(一个
intersection type
),而不是
|
union type
):
type X = { foo: string };
type Y = { bar: string };
type Z = { baz: string };
type XYZ = X & Y & Z;
从交叉点类型文档中:
交叉点类型将多个类型合并为一个类型。这允许您将现有类型添加到一起,以获得具有所需的所有特征的单个类型。例如,
Person & Serializable & Loggable
是一个
Person
Serializable
和
Loggable
. 这意味着此类型的对象将拥有这三种类型的所有成员。
Working on the playground
如果你这么说的话
foo
存在,
bar
baz
必须
没有定义,我认为你应该坚持交叉类型,但是你必须告诉TypeScript你知道
福
type assertion
. 因为否则,它不会知道你在处理
X
而不是
Y
Z
. 例如。:
type X = { foo: string };
type Y = { bar: string };
type Z = { baz: string };
type XYZ = X | Y | Z;
function foo(xyz: XYZ): string | undefined {
if ("foo" in xyz) { // Or whatever appropriate check
return (xyz as X).foo;
}
return undefined;
}
On the playground
.
另一种选择是
function overloads
XYZ
它仍然需要您有逻辑来检测您正在处理的内容,以及类型断言。