首页 > 解决方案 > 有趣的行为:对象字面量只能指定已知属性

问题描述

这里有类似的问题,我可以理解这个错误的性质:

type Person = { name: string };

// Error: Object literal may only specify known properties, and 'age' does not exist in type 'Person'.
const person: Person = { name: 'Sarah', age: 13 };

所以这失败了,因为属性age不是Person有意义的类型的一部分。

但是,我可以毫无问题地做到这一点:

type Person = { name: string };

const obj = { name: 'Sarah', age: 13 };
const person: Person = obj;

console.log(person); // { name: 'Sarah', age: 13 }

为什么第一个失败而第二个没有 - 这两个例子不应该都失败还是都通过?

至于我,这两个代码片段是相同的。不是吗?

更新:

这是Typescript Handbook对这种行为的解释:

对象文字在将它们分配给其他变量或将它们作为参数传递时会得到特殊处理并进行过多的属性检查。如果一个对象字面量有任何“目标类型”没有的属性,你会得到一个错误。

标签: typescript

解决方案


从 TypeScript 1.6 开始,对象字面量中的属性在分配给它们的类型中没有对应的属性被标记为错误。

基本上:TS 编译器知道永远不会使用年龄,这就是它对你生气的原因。在第二个示例中,它不知道年龄将永远不会用作正常对象的一部分。一旦它被复制到 Person 只有名称继续存在

TLDR:使用文字初始化时,TSC 是严格的


推荐阅读