TypeScript对象键转换函数:类型提示与返回类型问题求助
解决TypeScript对象键名转换函数的类型提示与返回值类型问题
修改后的完整实现
interface Target { name: string; ID: number; } function objectAdapter<T extends Record<TransformMap[keyof Target], any>, TransformMap extends { [K in keyof Target]: keyof T }>( data: T, transformMap: TransformMap & { [K in keyof Target]: T[TransformMap[K]] extends Target[K] ? keyof T : never } ): Target { return Object.entries(transformMap).reduce((result, [targetKey, sourceKey]) => { result[targetKey as keyof Target] = data[sourceKey]; return result; }, {} as Target); } // 使用示例,此时transformMap会有正确的IDE提示,result类型为Target const result = objectAdapter( { nickname: 'link', id: 123456 }, { name: 'nickname', ID: 'id' } );
关键改进点
- 类型约束保证类型匹配:
- 泛型
TransformMap强制其键为Target的所有键,值为输入对象T的键。 - 额外添加的交叉类型约束,确保输入对象中对应键的类型和
Target的属性类型一致,避免类型不匹配的错误。
- 泛型
- IDE提示修复:
明确TransformMap的键是Target的键、值必须是T的键后,IDE会自动补全transformMap的键名,并提示可选的源键。 - 返回值类型正确推断:
通过将reduce初始值断言为Target,并指定函数返回值类型为Target,最终result的类型严格符合Target接口,不再是string|number的联合类型。
验证效果
- 填写
transformMap时,IDE会自动提示name和ID作为必填键,且每个键的可选值为输入对象T的键(比如nickname和id)。 result的name属性类型为string,ID属性类型为number,完全匹配Target接口定义。
内容的提问来源于stack exchange,提问作者vita-mina
相关产品推荐
相关产品推荐

