parameters可自动提取函数参数类型元组,支持可选、rest及泛型函数,但不支持重载;需传typeof fn,不可传调用结果,js中依赖完整jsdoc注释。

直接用 Parameters<typeof></typeof> 就能拿到它的参数类型元组,不用手动写,也不用猜。
Parameters 的基本用法
它是个泛型工具类型,只接收函数类型(不是调用结果),返回一个由所有参数构成的只读元组类型。
- 写法固定:必须传
typeof fn,比如Parameters<typeof fetchdata></typeof> - 结果是元组:如
(a: string, b?: number) => void→[string, number?] - 支持可选参数、rest 参数、泛型函数,但不支持重载函数的多个签名(只取最后一个)
常见使用场景
多数时候不是为了“看类型”,而是为了复用和约束。
- 封装高阶函数:比如日志包装器,参数类型自动对齐原函数
- 构造参数校验函数:
function validate<f>(fn: F, args: Parameters<f>)</f></f> - 配合
ReturnType一起用:type CallResult = (...args: Parameters<f>) => ReturnType<f></f></f> - 提取单个参数:
Parameters<typeof fn>[0]</typeof>拿第一个参数类型
JavaScript 文件中也能用,但有前提
TypeScript 项目里引入 .js 文件时,Parameters 能工作,但依赖类型信息来源:
- 有完整 JSDoc 注释(带
@param和@returns)→ 类型准确 - 没注释或注释不全 → 默认推成
any[],失去类型保护意义 - 建议 JS 文件至少补上基础 JSDoc,否则不如直接迁成 .ts
容易踩的坑
几个典型错误,一用就报错:
- 写成
Parameters<fetchdata></fetchdata>—— 这是调用表达式,不是类型,会报错 - 对对象方法直接用:
Parameters<typeof obj.method></typeof>可能失效,推荐先用类型别名定义函数类型 - 遇到 rest 参数时,元组末尾是数组类型,比如
(x: number, ...ys: string[]) => void→[number, string[]]










