【发布时间】:2021-05-11 17:11:49
【问题描述】:
我正在尝试制作一个包装函数,它将一个函数作为输入并返回一个新类型的函数,该函数允许参数列表和包含参数名称作为键的对象。
我为此编写了以下代码。该代码按预期工作。问题是我传递了一个附加类型,其中包含作为参数名称的键和作为该参数类型的值。我想动态地做到这一点。我想访问参数的名称
//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);
Parameters 函数返回一个命名元组(我猜这是一个新特性)。有什么方法可以获取该元组的名称/标签。您也可以建议任何其他方式。
谢谢。
###编辑:
好的,经过一些研究,我发现我们无法获取函数参数的名称。所以现在我的目标是稍微缩短我的代码。在上面的代码中,我传递了一个对象来代替Args。我只想传递一个字符串数组。
const wrappedAdd = wrapper<typeof add, ["x", "y"]>(add);
我想使用这个数组动态生成一个对象。谢谢
【问题讨论】:
-
并非所有参数都可能有名称。如果
func像wrapper一样有一个rest 参数怎么办?作为其余参数传递的参数的名称应该是什么?通常如果你需要命名参数,你应该传递一个对象而不是位置参数。 -
@cdhowie 我们可以认为该函数将始终具有命名参数,而不是像
add函数这样的静止参数 -
@cdhowie 我想你没有得到我的问题。考虑是否存在具有所有命名参数的函数。有什么方法可以将这些名称作为 typescript 元组或数组类型获取?
-
@cdhowie 不,这不能回答我的问题。我想在运行时命名不在变量中的打字稿类型。
-
@captain-yossarian 哦。 NP。我会采用其他方法。感谢您的宝贵时间
标签: javascript typescript