能否在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
相关产品推荐
相关产品推荐

