幻影类型与Symbol品牌化:运行时安全的类型标签
利用交叉类型与唯一Symbol实现编译期与运行时的双重类型安全,避免原始类型误用。 · 难度:入门 · +10XP
幻影类型与Symbol品牌化
幻影类型(phantom type)是一种不占用的类型参数,结合Symbol品牌化(branding),可以在运行时通过唯一标识区分同构数据。例如,将USD与EUR都表示为number,但通过品牌化让编译器禁止直接算术混用。本教程展示如何用交叉类型 & { __brand: unique symbol } 创建品牌类型,并在运行时用Symbol检查有效性。这比单纯依赖编译期检查更适用于I/O边界。
// 定义品牌类型
const usdBrand = Symbol('USD');
type USD = number & { __brand: typeof usdBrand };
const eurBrand = Symbol('EUR');
type EUR = number & { __brand: typeof eurBrand };
function createUSD(amount: number): USD {
if (amount < 0) throw new Error('负数金额');
return amount as USD;
}
function addUSD(a: USD, b: USD): USD {
return (a + b) as USD;
}
// 运行时验证
function isUSD(val: unknown): val is USD {
return typeof val === 'number' && val >= 0;
}