typescript - 打字稿:对象扩展运算符的类型不正确?
问题描述
考虑这个代码片段:
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 版本。我很困惑。
编辑:这是从评论到 github 问题的链接,具有完全相同的问题https://github.com/microsoft/TypeScript/issues/13195#issuecomment-373178677。现在这就是答案。
解决方案
主要问题是类型Partial<Foo>
:
let b: Partial<Foo> = { x: "#", y: undefined };
当您指定变量类型时,ts 编译器通常会忽略赋值的右侧,并且不会将其用于类型推断(有一些例外,但通常它是这样工作的)。
推荐阅读
- node.js - 如何在nodejs中保存文件?
- react-native - 远程交互式推送通知 - 如何?
- react-native - 在 React Native 中向组件添加子组件
- c++ - 现代Cmake找不到Eigen库依赖
- javascript - 单击时滚动到 Kendo Grid 行 - 出现意外的 JavaScript 错误
- c++ - TZ 时间的 C++ 结构,但没有日期?
- javascript - Requirejs 和 polyfill.io mishmash
- mysql - 使用 socket.io 连接到带有套接字的 mysql 数据库时出错
- javascript - 如何在 d3.js 中制作分组压缩圆图?
- python - 除非必要,否则如何避免使用 conda-forge 包?