Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法在typescript中获取函数参数的名称?_Javascript_Typescript - Fatal编程技术网

Javascript 有没有办法在typescript中获取函数参数的名称?

Javascript 有没有办法在typescript中获取函数参数的名称?,javascript,typescript,Javascript,Typescript,我试图创建一个包装器函数,它将函数作为输入,并返回一个新类型的函数,该函数允许参数列表和包含参数名作为键的对象 我已经为此编写了以下代码。代码按预期工作。问题是我传递了一个额外的类型,其中包含键作为参数名,值作为该参数的类型。我想动态地这样做。我想访问参数的名称 //I want remove this Args parameters and make it dynamically using F type. function wrapper<F extends (...args: any

我试图创建一个包装器函数,它将函数作为输入,并返回一个新类型的函数,该函数允许参数列表和包含参数名作为键的对象

我已经为此编写了以下代码。代码按预期工作。问题是我传递了一个额外的类型,其中包含键作为参数名,值作为该参数的类型。我想动态地这样做。我想访问参数的名称

//I want remove this Args parameters and make it dynamically using F type.
function wrapper<F extends (...args: any) => any, Args>(func: unknown) {
   type ParametersList = Parameters<F>;
   return func as (...args: [Args] | ParametersList) => ReturnType<F>;
}
const add = (x: number, y: number) => x + y;
const wrappedAdd = wrapper<typeof add, { x: number; y: number }>(add);

我想使用这个数组动态生成一个对象。谢谢

我认为最好在全局范围内定义任何类型


类型Elem=任何;
类型谓词=记录
类型还原<
Arr扩展了ReadonlyArray,
结果扩展记录={}
>=Arr扩展[]
? 结果
:Arr扩展[推断H]
? 结果与谓词
:Arr扩展为只读[…推断尾部,推断H]
? 尾巴延伸到只读光线
? 减少
:从不
:从不;
函数包装器any>(func:F):
(…args:[减少]|参数)=>ReturnType{
返回函数
}
常量add=(x:number,y:string,z:number[])=>x+y;
const wrappedad=包装器(添加);
常量add=(x:number,y:string,z:number[])=>x+y;
const wrappedad=wrapper(add)({0:1,1:'hello',2:[1]});//好啊
const wrappedad2=wrapper(add)(1,'hello',[1]);//好啊
顺便说一句,这里不需要使用类型断言。我的意思是你可以摆脱作为操作员的

如果您对更多此类类型的示例感兴趣,可以查看我的

这里有几乎纯JS的
Reduce
类型表示:

constreduce=(arr:T[],cache={})=>{
如果(arr.length==0){
返回缓存
}
如果(arr.length==1){
const[head]=arr;
返回{…缓存,[0]:头}
}
const[头,…休息]=arr;
返回reduce(rest,{…缓存,[rest.length]:head})
}

就像@jcalz说的:

参数名称在类型系统中不可见,除非作为IntelliSense的文档

无法推断TS中的参数名并将其放入另一种类型,因此我决定使用索引类型

第一个参数为
0
,第二个参数为
1
,以此类推

关于使用参数名称:

不过,有一个地方差异开始变得明显:可读性

它们纯粹用于文档和工具

const add=(x:number)=>x+x
类型Args=参数
类型Infer=Args扩展[inferr]?R:从来没有
类型Infer2=Args扩展[x:inferr]?R:从来没有

因此,我认为在当前版本的TypeScript中不可能这样做。

并非所有参数都有名称。如果
func
有一个rest参数,就像
wrapper
一样,该怎么办?作为rest参数传递的参数的名称应该是什么?通常,如果需要命名参数,则应该传递对象而不是位置参数。@ CDHOWIE,我们可以考虑函数总是有命名参数而不是REST参数,如<代码> Addio>function@cdhowie我想你没有明白我的问题。考虑是否有一个具有所有命名参数的函数。有什么方法可以把这些名称作为typescript元组或数组类型吗?@cdhowie没有,这并不能回答我的问题。我想要一个类型脚本类型,而不是在运行时的变量中。@yossarian Oh船长。NP我将采用其他方法。谢谢你的时间谢谢你的回答。使用数字作为对象的键会扼杀此目的。随着参数数量的增加,它将遇到与单独传递参数相同的问题have@MaheerAli我在那里做了一个更新,我们可以通过任何方式传递一个类型作为字符串数组,其中包含键名。然后我们可以使用这些键从参数元组中生成对象、这些键和相应的值?@MaheerAli您能提供一个具有预期结果的示例吗?为了确保我们在同一条船上:)好的,兄弟,我更新了问题。
const wrappedAdd = wrapper<typeof add, ["x", "y"]>(add);