这里有类似的问题,我可以理解这个错误的本质:
\n\ntype Person = { name: string };\n\n// Error: Object literal may only specify known properties, and \'age\' does not exist in type \'Person\'.\nconst person: Person = { name: \'Sarah\', age: 13 };\n
Run Code Online (Sandbox Code Playgroud)\n\n所以这失败了,因为属性不是有意义的age
类型的一部分。Person
但是,我可以毫无问题地做到这一点:
\n\ntype Person = { name: string };\n\nconst obj = { name: \'Sarah\', age: 13 };\nconst person: Person = obj;\n\nconsole.log(person); // { name: \'Sarah\', age: 13 }\n
Run Code Online (Sandbox Code Playgroud)\n\n为什么第一个失败而第二个没有 - 这两个示例不应该都失败或都通过吗?
\n\n对我来说,这两个代码片段是相同的。不是吗?
\n\n更新:
\n\n以下是Typescript Handbook对此行为的解释:
\n\n\n\n对象字面量得到特殊处理,并在将它们分配给其他变量或将它们作为参数传递时进行过多的属性检查。如果对象字面量具有 \xe2\x80\x9ctarget\n 类型\xe2\x80\x9d 不具有\xe2\x80\x99t 的任何属性,则\xe2\x80\x99 将收到错误。
\n
从 TypeScript 1.6 开始,对象字面量中的属性如果在它们所分配到的类型中没有对应的属性,则会被标记为错误。
基本上:TS 编译器知道年龄永远不会被使用,这就是它对你生气的原因。在第二个示例中,它不知道年龄永远不会被用作普通对象的一部分。一旦它被复制到个人,只有名字继续存在
TLDR:当用文字初始化时,TSC 是严格的
归档时间: |
|
查看次数: |
16090 次 |
最近记录: |