TS 品牌类型:防止类型混淆的利器
学习使用品牌类型(Branded Types),在编译时区分相同基础类型的值。 · 难度:入门 · +15XP
品牌类型的概念
品牌类型是一种设计模式,通过给基础类型添加一个独特的“品牌”标记,使得原本相同的类型在编译时被视为不同类型。这可以有效防止将用户 ID 和订单 ID 等相同基础类型的值混淆使用。
实现方式
通常使用交叉类型与一个唯一的字面量属性结合,形成一个品牌类型。这个属性只在类型层面存在,运行时不会产生额外开销。
代码示例
type Brand<T, B> = T & { __brand: B };
type UserId = Brand<number, 'UserId'>;
type OrderId = Brand<number, 'OrderId'>;
function getUser(id: UserId) { /* ... */ }
function getOrder(id: OrderId) { /* ... */ }
const uid = 123 as UserId;
getUser(uid); // 正确
// getOrder(uid); // 编译错误
| 场景 | 无品牌类型 | 有品牌类型 |
|---|---|---|
| 函数参数 | 容易传错 | 编译期拦截 |
| 运行时开销 | 无 | 无(仅类型) |
练习提示:为邮箱地址和用户名创建品牌类型,并编写函数验证。