【问题标题】:Interesting behaviour: Object literal may only specify known properties有趣的行为:对象字面量只能指定已知属性
【发布时间】:2020-05-09 15:01:16
【问题描述】:

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

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 }

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

就我而言,这两个代码 sn-ps 是相同的。不是吗?

更新:

下面是Typescript Handbook 对此行为的解释:

对象字面量得到特殊处理并具有多余的属性 检查何时将它们分配给其他变量,或将它们作为 论据。如果一个对象字面量具有任何“目标 type”没有,会报错。

【问题讨论】:

  • 这太曲折了

标签: typescript


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2022-11-15
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2021-02-18
    • 2021-09-27
    相关资源
    最近更新 更多