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

能否在TypeScript中提取函数的参数名称?

TypeScript中能否获取函数参数的名称作为类型?

问题描述

使用Parameters类型可以获取函数的参数类型(甚至是带标签的元组),但如何访问参数的名称(即元组的标签)?在TypeScript 5.1.6版本中是否可行?

示例代码:

type MyFunction = (argumentName: number) => void

type FirstArgumentType<F extends ((p:any)=>any)> = Parameters<F>[0] 
type FirstArgumentName<F extends ((p:any)=>any)> = ... 

type T0 = Parameters<MyFunction> // [argumentName: number]
type T1 = FirstArgumentType<MyFunction> // number
type T2 = FirstArgumentName<MyFunction> // 期望得到 "argumentName"(字符串字面量类型)

本质需求是实现一个类型助手,输入(argumentName: number) => void时返回"argumentName"这样的字符串字面量类型。曾参考过相关的GitHub Issue,但未找到可行方案。

结论

在TypeScript(包括5.1.6版本)中,无法通过类型系统直接提取函数参数的名称作为字符串字面量类型。

原因在于:

  • Parameters<F>返回的具名元组中的参数名称属于元组标签,这只是TypeScript类型系统的装饰性语法糖,并不属于可被类型操作捕获的实际类型信息。
  • 所有类型操作(比如索引访问、条件类型等)只能获取元组元素的类型,无法读取标签本身。

如果需要获取函数参数的名称,只能在运行时通过以下方式实现:

function getParamNames(fn: Function): string[] {
  const fnStr = fn.toString();
  const match = fnStr.match(/\((.*?)\)/);
  return match ? match[1].split(',').map(p => p.trim()).filter(Boolean) : [];
}

// 示例
const myFunc = (argumentName: number) => {};
console.log(getParamNames(myFunc)); // ["argumentName"]

内容的提问来源于stack exchange,提问作者dsalex1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:51:05