TypeScript中能否引用自身属性类型?实现类型安全日志
解决方案
要实现prop与prev/cur类型的严格绑定,你可以将Log<T>定义为基于T属性键的联合类型,通过映射类型遍历每个属性并生成对应类型的日志结构:
type Poo = { prop1: 1 | 2 | 3; prop2: "a" | "b" | "c"; } // 遍历T的每个属性键K,生成对应类型的日志结构,再合并为联合类型 type Log<T> = { [K in keyof T]: { prop: K; prev: T[K]; cur: T[K]; } }[keyof T]; const pooLogger: Log<Poo>[] = []; // 合法示例:prop1对应数字类型 const validLog: Log<Poo> = { prop: "prop1", prev: 2, cur: 1 }; pooLogger.push(validLog); // 非法示例:prop1的prev使用字符串,会触发类型错误 const invalidLog: Log<Poo> = { prop: "prop1", prev: "a", // 类型错误:类型"a"不能赋值给类型1 | 2 | 3 cur: 1 };
原理说明
- 映射类型
{ [K in keyof T]: ... }会遍历T的每个属性键K,为每个键生成一个专属的日志类型(比如当K是"prop1"时,prev和cur的类型就是1 | 2 | 3)。 - 最后通过
[keyof T]将所有映射生成的类型提取出来,组成一个联合类型。此时Log<Poo>等价于:{ prop: "prop1"; prev: 1 | 2 | 3; cur: 1 | 2 | 3; } | { prop: "prop2"; prev: "a" | "b" | "c"; cur: "a" | "b" | "c"; } - TypeScript会根据你指定的
prop值,自动推断出prev和cur必须匹配的类型,从而实现类型校验。
内容的提问来源于stack exchange,提问作者motgochim
相关产品推荐
相关产品推荐

