名义类型构造器:用类与交叉类型模拟名义类型系统
通过私有的类字段或交叉类型标记,实现类似Java/C#的名义类型,防止结构兼容性导致的赋值错误。 · 难度:入门 · +10XP
名义类型构造器
TypeScript是结构类型系统,但很多场景需要名义类型(nominal typing),例如数据库ID、货币类型等。本教程对比三种实现方式:使用类(私有成员)、使用交叉类型(品牌标记)、使用枚举(union discrimination)。重点展示如何编写一个泛型构造器 Brand,使得Brand与Brand互不兼容。同时讨论运行时性能与编译开销。
// 泛型品牌构造器
declare const brand: unique symbol;
type Brand = T & { [brand]: B };
function createUserId(raw: string): Brand {
// 验证逻辑
return raw as Brand;
}
function getPost(id: Brand) {}
const uid = createUserId('abc');
getPost(uid); // 类型错误:不能将UserId赋值给PostId