名义类型擦除器:利用 Symbol 在运行时隐藏品牌标记
使用 unique symbol 与 WeakMap 在运行时存储品牌标识,既保证类型安全又避免品牌字段序列化泄漏。 · 难度:入门 · +10XP
名义类型擦除器:利用 Symbol 在运行时隐藏品牌标记
单纯的交叉类型品牌会在 JSON.stringify 时暴露空对象字段。本教程介绍使用 WeakMap
const brandStore = new WeakMap<object, symbol>();
function brand<T extends object, B extends symbol>(obj: T, b: B): T & { __brand: B } {
brandStore.set(obj, b);
return obj as any;
}
function isBranded<T extends object, B extends symbol>(obj: T, b: B): obj is T & { __brand: B } {
return brandStore.get(obj) === b;
}
const myObj = brand({ name: 'test' }, Symbol('secret'));
console.log(JSON.stringify(myObj)); // {name: 'test'} 品牌隐藏