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

如何创建无需显式指定类型参数的TypeScript同参双方法对象类型?

如何定义TypeScript对象类型,让两个函数参数类型自动保持一致

我们可以通过泛型类型+辅助函数的方式实现,无需手动指定参数类型,TypeScript会自动推导并检查foo和bar的参数类型是否匹配:

解决方案代码

// 泛型类型:约束foo和bar使用相同的参数类型数组
type TestObj<T extends any[]> = {
  foo: (...args: T) => void;
  bar: (...args: T) => void;
};

// 辅助函数:自动推导泛型参数,无需手动指定
function createTestObj<T extends any[]>(obj: TestObj<T>): TestObj<T> {
  return obj;
}

合法使用示例

// 场景1:foo和bar参数类型完全一致
const test = createTestObj({
  foo: (a: string) => {
    console.log('foo');
  },
  bar: (b: string) => {
    console.log('bar');
  }
});

// 场景2:bar接受的参数是foo参数的前缀(符合函数参数逆变规则,允许省略后续参数)
const test2 = createTestObj({
  foo: (a: string, b: number) => {
    console.log('foo');
  },
  bar: (b: string) => {
    console.log('bar');
  }
});

不合法场景(TypeScript自动报错)

// 错误:bar的参数类型与foo不匹配
const test3 = createTestObj({
  foo: (a: string) => {
    console.log('foo');
  },
  bar: (b: number) => {
    console.log('bar');
  }
});

原理说明

  • TestObj<T>通过泛型T约束了foo和bar必须使用相同的参数类型数组。
  • 辅助函数createTestObj会自动从传入的对象字面量中推导T的具体类型(即foo的参数类型),然后自动校验bar是否符合该参数类型要求。
  • 整个过程无需手动指定泛型参数,完全由TypeScript自动完成类型推导和错误检查。

内容的提问来源于stack exchange,提问作者Geoff Rich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:20:22