如何让TypeScript在比较不同字符串别名类型时触发类型错误?
TypeScript中实现基于string的不同名义类型,禁止跨类型全等比较
普通的类型别名type String1 = string无法满足需求,因为TypeScript采用结构类型系统,结构一致的类型会被视为同一类型。要实现两个基于string但类型不同的别名,需要通过模拟名义类型来实现,核心思路是给每个类型添加唯一的"品牌"标识,让TypeScript认为它们是不同类型。
实现代码
// 定义带品牌标识的类型 type String1 = string & { __brand: 'String1' }; type String2 = string & { __brand: 'String2' }; // 辅助函数用于创建对应类型的变量(避免重复写类型断言) const createString1 = (value: string): String1 => value as String1; const createString2 = (value: string): String2 => value as String2; // 创建对应类型的变量 const firstString = createString1('something'); const secondString = createString2('something'); // 此处会触发类型错误:此条件将始终返回 'false',因为类型 'String1' 和 'String2' 没有重叠。 if (firstString === secondString) { console.log('不会执行到这里'); }
原理说明
- 通过给
string交叉一个带有唯一字面量值的对象类型{ __brand: 'String1' },让String1和String2的结构产生差异,TypeScript会将它们识别为不同的名义类型。 - 辅助函数
createString1和createString2用于封装类型断言,简化变量创建过程,同时保证类型的正确性。 - 当对不同品牌的类型变量进行全等比较时,TypeScript会检测到类型不兼容,直接抛出类型错误,符合需求。
内容的提问来源于stack exchange,提问作者Jonathan Pujol
相关产品推荐
相关产品推荐

