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

TypeScript中如何基于原始对象类型生成修改键名的自定义类型

TypeScript 动态修改类型键名解决方案

完全可以实现该需求,TypeScript 4.1 及以上版本提供了**键重映射(Key Remapping)**语法,可在映射类型中通过as关键字动态转换键名,以下是完整实现代码:

核心类型定义

// 键名转换规则:可根据需求调整模板逻辑
type ModifiedName<T extends string> = `${T}EXTENSION`;

// 传入原对象类型,返回键名修改后的新对象类型
type SuperType<T extends Record<string, any>> = {
  // 遍历原类型的每个键,通过as将键名替换为转换后的结果
  // K & string 用于过滤非字符串类型的键,避免类型报错
  [K in keyof T as ModifiedName<K & string>]: T[K]
};

使用示例

// 传入原类型{getData: any, postData: number},生成目标类型
const superObj: SuperType<{getData: any, postData: number}> = {
  getDataEXTENSION: 'query result',
  postDataEXTENSION: 200
};

// 可正常获得类型提示和校验
superObj.getDataEXTENSION; // 类型为any
superObj.postDataEXTENSION; // 类型为number

原写法报错原因

你之前直接书写[key: ModifiedName<keyof T>]: any的写法属于索引签名语法,不支持传入动态计算的联合类型作为索引约束,只有映射类型配合as键重映射语法才能实现键名的动态修改。

补充说明

如果你需要首字母大写的转换效果(比如getData转换为GetDataEXTENSION),只需将ModifiedName调整为你最初的写法即可:

type ModifiedName<T extends string> = `${Capitalize<T>}EXTENSION`;

内容的提问来源于stack exchange,提问作者Aviran Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:54:05