TypeScript是否支持映射列表类型?能否通过映射修改Parameters<Func>类型?
解决方案
你要实现的需求可以通过 TypeScript 的元组映射类型完成,不需要修改原有数组类型的内部规则,只需要对函数参数的元组类型做一次遍历转换即可。
你需要的Mapper类型定义如下:
type Mapper<T extends any[]> = { [K in keyof T]: [T[K]] }
这个类型会遍历传入的元组T的每一个位置,将对应位置的元素类型包裹为单元素数组类型,正好匹配你传参时每个参数都被数组包裹的结构。
改造后的callFunction完整代码如下:
const func1 = (x1: string, x2: string) => `${x1} + ${x2}`; const func2 = (x1: number, x2: number) => x1 + x2; type Mapper<T extends any[]> = { [K in keyof T]: [T[K]] } function callFunction<Fn extends (...args: any[]) => string | number>(func: Fn, ...params: Mapper<Parameters<Fn>>) { // 业务逻辑示例: const inputs = params.map(item => item[0]); // 这里加类型断言是因为TS map方法默认返回普通数组,无法自动推导为和参数匹配的元组类型,业务逻辑安全的前提下断言无风险 return func(...inputs as Parameters<Fn>); } // 以下调用无类型报错 callFunction(func1, ['1'], ['1']); callFunction(func2, [1], [1]);
内容的提问来源于stack exchange,提问作者danielmoessner
相关产品推荐
相关产品推荐

