typescript 中如何推断剩余参数的类型?

作者站长头像
站长
· 阅读数 26

在写单元测试中,我想抽象一个通用的函数,避免重复书写。函数的定义如下:

export function defineUnitTest<R> (
  name: string,
  fn: (...args: any) => R,
  // 这里 source 参数的类型应该对应 fn 函数的参数类型
  source: any,
  expected: R,
) {
  it(name, () => {
    expect(fn(...source)).toEqual(expected);
  });
}

declare function twoSum (nums: number[], target: number): number[];

// 使用这个函数时,第三个参数的类型应该是通过第二个参数推断出来的。
defineUnitTest("some desc", twoSum, [[2, 7, 11, 15], 9], [0, 1]);

但是我不知道如果建立 fn 函数参数的类型和 source 类型之间的联系。

请问要怎么写才可以让 source 的类型等于 fn 参数类型的数组?

回复
1个回答
avatar
test
2024-06-21

ts只能做静态类型检查; 这里只能用泛型处理一下;

export function defineUnitTest<F extends (...arg: any[]) => any>(
  name: string,
  fn: F,
  source: Parameters<F>,
  expected: ReturnType<F>,
) { }

declare function twoSum(nums: number[], target: number): number[];

defineUnitTest<typeof twoSum>('abc', twoSum, [[1, 2], 1], [])
ParametersReturnType 是TS内置的工具类型,获取函数的参数类型和返回值类型的
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容