TypeScript中如何让结构相同的不同标称类型赋值编译失败?
解决TypeScript空接口赋值兼容问题的几种方法
TypeScript采用结构类型系统,空接口因结构完全一致会被判定为兼容。以下几种方法可让a = b编译失败,适用于TypeScript 4.7.4版本:
使用品牌类型(Branded Types)
给接口添加唯一的Symbol属性,让TypeScript识别为不同结构:const brandA = Symbol('A'); const brandB = Symbol('B'); interface A { [brandA]: never; } interface B { [brandB]: never; } let a: A; let b: B; a = b; // 编译失败:类型"B"缺少类型"A"要求的[brandA]属性原理:Symbol作为属性键具有唯一性,never类型确保外部无法赋值该属性,同时让两个接口结构存在差异,触发类型不兼容错误。
使用Class代替接口
TypeScript对Class采用名义类型检查,即使结构相同,不同Class的实例类型也不兼容:class A {} class B {} let a: A; let b: B; a = b; // 编译失败:无法将类型"B"分配给类型"A"这种方法最简单直接,适合不需要接口特性的场景。
添加唯一字面量属性
给每个接口添加一个值不同的字面量类型属性,强制结构不兼容:interface A { __type: 'A'; } interface B { __type: 'B'; } let a: A; let b: B; a = b; // 编译失败:类型""B""无法分配给类型""A""原理:字面量类型是严格匹配的,
__type的取值不同导致两个接口结构不兼容。
内容的提问来源于stack exchange,提问作者Cheetah
相关产品推荐
相关产品推荐

