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 参数类型的数组?
回复
1个回答

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], [])
Parameters
和ReturnType
是TS内置的工具类型,获取函数的参数类型和返回值类型的
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容