Typescript报错2345不同场景表现不一致问题咨询
TypeScript类型校验规则说明
这个问题是TypeScript两个核心类型规则共同作用的结果:结构类型校验(鸭子类型) 和 对象字面量额外属性校验。
TEST1 合法原因
Empty是没有定义任何属性的空接口,在结构类型校验规则下,任意对象都满足「无必须属性」的要求,哪怕携带额外属性也完全符合类型约束,因此传入带有a、b属性的对象字面量不会报错。
TEST2 报错原因
你收到的报错触发了TypeScript针对直接作为参数传递的对象字面量的特殊校验规则:
类型
'{ a: number; b: number; }'的参数不能赋值给类型'Single'的参数。对象字面量仅可指定已知属性,而'b'不存在于类型'Single'中。(2345)
该规则是TypeScript为了避免开发者手误多写、写错属性名新增的严格校验:当你直接把对象字面量作为参数传入函数时,除了要满足目标类型的必填属性要求外,不允许携带目标类型未定义的额外属性。你传入的字面量多了Single接口没有声明的b属性,因此触发报错。
TEST3 合法原因
obj是预先声明的变量,TypeScript会自动推导它的类型为{a: number, b: number}。当你把这个变量传给printSingle时,不会触发对象字面量的额外属性校验,只会走普通的结构类型校验:只要变量包含目标类型要求的所有属性(本示例中obj存在符合要求的a: number属性),就会被判定为类型合法,额外的b属性不会影响校验结果。
内容的提问来源于stack exchange,提问作者user1814274
相关产品推荐
相关产品推荐

