打字稿:对象传播运算符的类型不正确?

Mat*_*orm 5 typescript

考虑这个代码片段:

type Foo = {
  x: string;
  y: number;
};

let a: Foo = {
  x: "@",
  y: 3,
};

let b: Partial<Foo> = { x: "#", y: undefined };

let c = { ...a, ...b };
Run Code Online (Sandbox Code Playgroud)

清楚地键入的c不能Foo因为属性yundefined:运行时的值c{x: "#", y: undefined}(至少在Chrome)。然而 Typescript 将c类型推断为{ x: string; y: number;}. 您可以在https://www.typescriptlang.org/play 中查看 4.0.5 版本。我糊涂了。

编辑:这是从评论到 github 问题的链接,问题完全相同https://github.com/microsoft/TypeScript/issues/13195#issuecomment-373178677。现在这就是答案。

ans*_*oyt 1

主要问题是类型Partial<Foo>

let b: Partial<Foo> = { x: "#", y: undefined };
Run Code Online (Sandbox Code Playgroud)

当您指定变量类型时,ts 编译器通常会忽略赋值的右侧,并且不会将其用于类型推断(有一些例外,但一般来说它是这样工作的)。