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

