TypeScript如何定义可给属性添加previous前缀的通用Previous类型
实现方案
核心实现(TS 4.1+)
该实现依赖TS 4.1版本新增的模板字面量类型和键重映射特性,代码如下:
// 实现给所有属性加previous前缀的泛型 type Previous<T> = { [K in keyof T as `previous${Capitalize<string & K>}`]: T[K] }; // 组合原属性和加前缀的属性,得到最终的Change泛型 type Change<T> = T & Previous<T>;
示例验证
以你提到的Product接口做测试:
interface Product { name: string; price: number; stock: number; } type ProductChange = Change<Product>;
最终生成的ProductChange类型等价于以下结构,完全符合需求:
{ name: string; price: number; stock: number; previousName: string; previousPrice: number; previousStock: number; }
特殊场景调整
- 如果你不需要前缀后属性名首字母大写(比如要生成
previousname而非previousName),去掉Capitalize工具类型即可:type Previous<T> = { [K in keyof T as `previous${K}`]: T[K] }; - 如果需要兼容数字、Symbol类型的属性键,可自行调整类型过滤逻辑,按需保留或忽略非字符串类型的键即可。
内容的提问来源于stack exchange,提问作者nehalist
相关产品推荐
相关产品推荐

