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

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

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 参数类型的数组?

阅读 833
2 个回答
✓ 已被采纳

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内置的工具类型,获取函数的参数类型和返回值类型的

可以使用内置的 Parameters 和 ReturnType 方法定义参数。

export function defineUnitTest<T extends (...args: any[]) => any> (
  name: string,
  fn: T,
  source: Parameters<T>,
  expected: ReturnType<T>,
) {
  it(name, () => {
    expect(fn(...source)).toEqual(expected);
  });
}
推荐问题
logo
Microsoft
子站问答
访问
宣传栏