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

Typescript如何实现带泛型key的对象扩展方法并正确推导类型?

解决方案

你遇到的类型报错本质是TypeScript对动态计算属性的默认类型推导会自动把key的类型拓宽为string,不会保留泛型K的字面量类型特征,以下是两种可直接落地的解决方式:

方案1:使用类型断言覆盖默认推导

你的业务逻辑本身完全符合返回值类型要求,只需要在返回值处补充类型断言即可解决报错:

const augment = <T extends object, K extends string>(obj: T, key: K): T & Record<K, string> => {
    return { ...obj, [key]: "someString" } as T & Record<K, string>;
};

调用时传入字面量key,返回值会自动推导为你期望的类型:

const anObj = { aProp: 'aVal' };
const anotherObj = augment(anObj, "aKey");
// anotherObj 类型推导为:{ aProp: string } & { aKey: string }
// 可以直接读取 anotherObj.aKey 获得正确的类型提示

方案2:使用Object.assign避免类型拓宽

Object.assign的内置类型定义天然支持合并多对象的类型,不需要额外写类型断言,写法更安全:

// 原地修改原对象的版本
const augment = <T extends object, K extends string>(obj: T, key: K): T & Record<K, string> => {
    return Object.assign(obj, { [key]: "someString" });
};

// 不修改原对象的不可变版本
const augmentImmutable = <T extends object, K extends string>(obj: T, key: K): T & Record<K, string> => {
    return Object.assign({}, obj, { [key]: "someString" });
};

内容的提问来源于stack exchange,提问作者Norman Pellet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:48:04