在TypeScript中能否基于已有类型修改键名创建新类型?
TypeScript中如何基于已有类型修改键名创建新类型?
当然可以!TypeScript 4.1及以上版本支持模板字面量类型结合映射类型的键重映射,就能实现你想要的修改键名创建新类型的需求。
实现方案
针对你给出的场景,正确的写法如下:
// 原类型 type IOne = { alpha: string, bravo: number, charlie: Record<string, boolean> }; // 通用的键名后缀添加工具类型 type AppendFoo<T> = { [K in keyof T as `${K}-foo`]: T[K] }; // 生成目标类型 type IThree = AppendFoo<IOne>;
效果验证
上述代码生成的IThree类型完全符合你的期望:
type IThree = { "alpha-foo": string; "bravo-foo": number; "charlie-foo": Record<string, boolean>; }
原理说明
这里核心用到了TypeScript的两个特性:
- 映射类型的键重映射:通过
as关键字可以在遍历原类型键的同时修改键名,替代原本直接使用K in keyof T的固定键名逻辑。 - 模板字面量类型:用
${K}-foo这种模板语法,将原键名K和字符串-foo拼接成新的键名,支持字符串类型的键名动态生成。
扩展用法
这种方式还能灵活实现其他键名修改需求,比如给键名添加前缀:
type PrependFoo<T> = { [K in keyof T as `foo-${K}`]: T[K] }; type IFour = PrependFoo<IOne>; // 生成的IFour:{ "foo-alpha": string; "foo-bravo": number; "foo-charlie": Record<string, boolean>; }
或者替换键名中的特定字符:
type ReplaceBarWithBaz<T> = { [K in keyof T as K extends `${infer P}bar${infer Q}` ? `${P}baz${Q}` : K]: T[K] };
内容的提问来源于stack exchange,提问作者James Long
相关产品推荐
相关产品推荐

