如何解决TypeScript中扩展函数返回对象的类型不匹配问题?
解决TypeScript函数扩展的类型错误问题
问题出在extend方法的类型定义上:原代码中参数obj1使用了宽泛的{ [name: string]: Function }类型,导致TypeScript无法保留传入对象的具体属性信息,返回值类型仅被推断为{ test1(): void },自然识别不了test2。
可以通过泛型来保留传入扩展对象的类型信息,修改后的代码如下:
const fn1 = function () { return { // 添加泛型T,约束为键值对且值为函数类型 extend<T extends Record<string, Function>>(obj1: T) { return { test1() {}, ...obj1 } as { test1(): void } & T; } } } const var1 = fn1().extend({ test2: function () {} }); var1.test1() // 正常调用 var1.test2() // 类型识别正常,无错误
关键改动说明:
- 给
extend方法添加泛型参数T,并通过Record<string, Function>约束T的结构(键为字符串,值为函数),让TypeScript精准捕获传入扩展对象的具体类型。 - 将参数
obj1的类型改为泛型T,替代原有的宽泛索引类型,保留传入对象的属性名和类型信息。 - 使用类型断言
as { test1(): void } & T明确返回值类型是原有方法与扩展对象类型的交集,确保TypeScript能正确识别合并后的所有属性。
如果不想用类型断言,也可以通过Object.assign让TypeScript自动推断合并类型,效果一致:
const fn1 = function () { return { extend<T extends Record<string, Function>>(obj1: T) { return Object.assign({ test1() {} }, obj1); } } }
内容的提问来源于stack exchange,提问作者Jonas P.
相关产品推荐
相关产品推荐

