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

如何解决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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:56:01