示例说明
创建带运行时校验守卫的品牌名义类型,实现跨模块边界的类型安全数据处理。本示例属于数据完整性场景,提供可直接复制使用的typescript代码片段,附带边界条件与使用注意事项。
技术要点
- Brand 用交叉类型加只读标记实现名义类型
- brand 构造时运行 guard 校验不通过抛错
- isEmail 类型谓词实现类型收窄
代码解读
上述代码实现了品牌类型运行时校验的核心逻辑。创建带运行时校验守卫的品牌名义类型,实现跨模块边界的类型安全数据处理。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。Brand 用交叉类型加只读标记实现名义类型,brand 构造时运行 guard 校验不通过抛错。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解品牌类型运行时校验的适用场景与限制条件。isEmail 类型谓词实现类型收窄。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
export type Brand<T,B extends string> = T & { readonly __brand: B };export function brand<T,B extends string>(value:T,guard:(v:T)=>boolean,label:B):Brand<T,B>{if(!guard(value))throw new Error('invalid '+label);return value as Brand<T,B>;}export type Email=Brand<string,'Email'>;export type UserId=Brand<number,'UserId'>;export function isEmail(s:string):s is Email{return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s);}export function makeEmail(s:string):Email{if(!isEmail(s))throw new Error('invalid email');return s as Email;}