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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:15:05