【发布时间】:2020-11-23 17:19:55
【问题描述】:
考虑一下这段代码sn-p:
type Foo = {
x: string;
y: number;
};
let a: Foo = {
x: "@",
y: 3,
};
let b: Partial<Foo> = { x: "#", y: undefined };
let c = { ...a, ...b };
c 的类型显然不能是 Foo,因为属性 y 是 undefined:c 的运行时值是 {x: "#", y: undefined}(至少在 Chrome 中)。然而 Typescript 将 c 类型推断为 { x: string; y: number;}。您可以签入https://www.typescriptlang.org/play 以获取版本 4.0.5。我很困惑。
编辑:这是从 cmets 到 github 问题的链接,问题完全相同 https://github.com/microsoft/TypeScript/issues/13195#issuecomment-373178677 。现在这就是答案。
【问题讨论】:
-
请看这里github.com/microsoft/TypeScript/issues/13195 另外,AFAIK,传播运算符在 TS 中的输入不是很好
-
TS 和 JS 一样:如果你明确指出一个 prop,它肯定存在于一个对象中,即使是
undefined值。确保您需要致电hasOwnProperty -
@captain-yossarian 你应该回答这个问题(也许引用this comment);编译器无法始终理解“present-but-
undefined”和“missing”之间的区别。扩展运算符似乎假定缺少undefined可选属性,并且不会覆盖以前设置的属性。这个假设在大多数情况下可能是正确的,但在此处的示例中并不正确。请注意,您使用的是必需属性,而不是可选属性,the issue goes away。 -
@jcalz 我无法回答,因为我是从您的回答和 cmets 中学到的。你的回答会比我的好)
标签: typescript