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
相关产品推荐
相关产品推荐

