为什么TypeScript有时不允许给结构兼容的类型赋值?
问题原因说明
这个报错不是TypeScript结构化类型系统失效,而是默认类型拓宽(Type Widening)规则导致的,两个对象的实际推导类型并不完全匹配:
- 你给
tag1_1显式标注了CollectorTag类型,它的type属性类型直接被确定为TagType.COLLECTOR这个精确的枚举成员类型,完全符合接口要求,赋值不会报错。 - 你没有给
tag2_1加显式类型标注,TypeScript对普通字面量初始化的对象会做类型拓宽:把type: TagType.COLLECTOR的类型推导为更宽泛的TagType枚举类型(包含TagType.SIMPLE、TagType.COLLECTOR两种可能取值)。而CollectorTag接口要求type必须是精确的TagType.COLLECTOR类型,类型不匹配因此触发报错。
常用解决方案
方案1:给初始化对象加显式类型标注
const tag2_1: CollectorTag = { type: TagType.COLLECTOR, }; const tag2_2: CollectorTag = tag2_1;
方案2:用as const断言冻结对象类型,阻止类型拓宽
const tag2_1 = { type: TagType.COLLECTOR, } as const; const tag2_2: CollectorTag = tag2_1;
方案3:给属性单独加断言窄化类型
const tag2_1 = { type: TagType.COLLECTOR as TagType.COLLECTOR, }; const tag2_2: CollectorTag = tag2_1;
内容的提问来源于stack exchange,提问作者Łukasz Zaroda
相关产品推荐
相关产品推荐

