typescript - 有趣的行为:对象字面量只能指定已知属性
问题描述
这里有类似的问题,我可以理解这个错误的性质:
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 1.6 开始,对象字面量中的属性在分配给它们的类型中没有对应的属性被标记为错误。
基本上:TS 编译器知道永远不会使用年龄,这就是它对你生气的原因。在第二个示例中,它不知道年龄将永远不会用作正常对象的一部分。一旦它被复制到 Person 只有名称继续存在
TLDR:使用文字初始化时,TSC 是严格的
推荐阅读
- symfony - Symfony 4 无法通过 PHPUnit 测试登录
- python - 重置索引后无法过滤索引列中包含特定值的行
- laravel-5 - Toastr 一次只显示一条消息
- r - 如何为 Y =(给定变量的不同列中的值)和 X = 时间创建多个图表
- c# - Access 报告对话框中的参数值
- pandas - Python Dash 情节更新表
- python-3.x - 有条件地操作数据框
- java - Selenium 点击有动作与点击无动作
- c# - FTP 连接问题 - 将 FluentFTP 用于端口 990 -TLS
- c# - MVC.NET Core 中的条件验证(RequiredIf)