You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:33:48