首页 > 解决方案 > 打字稿:对象扩展运算符的类型不正确?

问题描述

考虑这个代码片段:

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因为属性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。现在这就是答案。

标签: typescript

解决方案


主要问题是类型Partial<Foo>

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

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


推荐阅读