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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:42:47