为何直接给带类型注解的变量赋值对象字面量会报错?
为什么两段TypeScript代码执行结果不同?
这是TypeScript的**多余属性检查(Excess Property Checks)**机制在起作用,具体原因如下:
直接赋值对象字面量时,TypeScript会对这个"新鲜"的字面量做额外校验:它会严格检查字面量的属性是否完全匹配目标类型
MyType的定义,一旦发现目标类型中不存在的属性(比如这里的age),就会抛出错误。这个机制是为了帮你避免拼写错误或者不小心添加了不需要的属性。先赋值给中间变量再传递时,情况不一样:当你把对象字面量赋值给没有显式类型注解的
mytype时,TypeScript会自动推断mytype的类型为{ name: string; age: number }。之后把mytype赋值给MyType类型的变量my时,TypeScript用的是结构类型兼容性规则——只要mytype包含MyType要求的所有属性,就允许赋值,不会再检查多余属性。因为{ name: string; age: number }是MyType的子类型,自然可以兼容。
简单说就是:直接用对象字面量赋值时,TS会多一层"严格校验";通过中间变量转手时,就只看结构是否兼容,不管多余属性。
内容的提问来源于stack exchange,提问作者nearworld
相关产品推荐
相关产品推荐

