我在理解 TS 中的联合时遇到问题,为什么下面的分配是有效的?我以为它只适用于const a = {a:12}
or {a:123,b:23}
or {a:12,b:12,c:123}
.
type abcd =
| {
a: number;
}
| {
a: number;
b: number;
}
| {
a: number;
b: number;
c: number;
};
const a: abcd = {
a:123,
c:234
};
游乐场链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBAhgRgYwCZQLwCgpagHygb022JgC4oA7AVwFs4IAnAbiOIF9XcDOTzq7GLYsTh9a9ZjygdieQsOxlK4wVKyjlAyQqwIxWocLYt0CAPYUAzsFjl4yNN14BGAEwBmADSc9HgCzoxuhAA
如果我改变,它不允许分配c
to somethingElse
:
const a: abcd = {
a:123,
somethingElse:234 // Error on this line
};
它给了我:
输入 '{ a: 数字;其他:数字; }' 不可分配给类型“abcd”。
对象文字只能指定已知属性,并且类型“abcd”中不存在“somethingElse”。(2322)
TLDR
联盟并不相互排斥。 https://github.com/microsoft/TypeScript/issues/38159您可以查看此答案中的“解决方法”部分,以获取解决方法,以实现具有 Union 类型、never 类型和可选属性组合的类型的互斥。
Union型的工作方式更接近于OR
门而不是XOR
门。也就是说,只要实例对象满足您的 Union 类型中的其中一种类型,它就被视为该 Union 类型的实例。
以下面为例:
type abcd =
| {
a: number;
}
| {
x: number;
y: number;
}
| {
p: number;
q: number;
r: number;
}
| {
x: number;
y: number;
};
const APY: abcd = {
a: 123,
p: 234,
y: 1,
};
作为常数APY
包含足够的属性被视为实例{ a: number; }
类型,可以存在于联合类型中的所有其他属性都是允许的。
Union 类型施加的唯一限制是,不允许使用 Union 类型中不存在的属性,并且实例必须具有足够的属性来满足 Union 中存在的类型之一。
解决办法
虽然 Union 类型本身对您没有帮助,但您可以将它与 never 类型结合使用来达到您想要的结果:
type abcd =
| {
a: number;
b?: never;
c?: never;
}
| {
a: number;
b: number;
c?: never;
}
| {
a: number;
b: number;
c: number;
};
/*
Type '{ a: number; c: number; }' is not assignable to type 'abcd'.
Property 'b' is missing in type '{ a: number; c: number; }' but required in type '{ a: number; b: number; c: number; }'.
*/
const a: abcd = {
a: 123,
c: 234,
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)