You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:05