Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Typescript 使用泛型对象的动态函数参数_Typescript - Fatal编程技术网

Typescript 使用泛型对象的动态函数参数

Typescript 使用泛型对象的动态函数参数,typescript,Typescript,一种常见的、广泛记录的模式是使用泛型指定函数的参数类型,如下所示: type Func<T> = (arg: T) => void; let example : Func<boolean>; // function(arg: boolean) type Func=(arg:T)=>void; 例如:Func;//函数(arg:boolean) 然而,我试图用一个泛型声明不同数量和类型的参数。我尝试的一种方法是使用包含类型的数组,如下所示: type Func&l

一种常见的、广泛记录的模式是使用泛型指定函数的参数类型,如下所示:

type Func<T> = (arg: T) => void;
let example : Func<boolean>; // function(arg: boolean)
type Func=(arg:T)=>void;
例如:Func;//函数(arg:boolean)
然而,我试图用一个泛型声明不同数量和类型的参数。我尝试的一种方法是使用包含类型的数组,如下所示:

type Func<T extends Array<any>> = (...arg: T) => void;
let example : Func<[string, number]>; // function(arg_0: string, arg_1: number)
type Func=(…arg:T)=>void;
例如:Func;//函数(参数0:string,参数1:number)
上面的注释显示了这方面的问题–在代码提示中为参数指定了泛型名称,这并不理想。为了给我的参数添加名称,我想到了使用对象作为泛型:

type Func<T extends Object> = (...arg: T) => void; // Error: A rest parameter must be of an array type.
let example : Func<{ a: string, b: number }>; // Goal: function(a: string, b: number)
type Func=(…arg:T)=>void;//错误:rest参数必须是数组类型。
例如:Func;//目标:函数(a:字符串,b:数字)
目标是使
示例
看起来像
函数(a:string,b:number)
,代码提示中包含参数名(
a
b
)。但是此代码会出错,因为
T
必须是用于spread运算符的数组。我很难找到将对象转换为数组的方法,或者将其应用于函数参数的替代方法

我尝试使用
keyof
,这导致了联合类型,但我不确定联合类型是否可以在保持名称关联的同时转换为数组


这可能吗?我在TS服务器和VS代码中看到了一些代码暗示的魔力,它保留了名称关联,即使在逻辑上它们应该丢失。如果是这样,使用单个泛型将
{a:string,b:number}
转换为
(a:string,b:number)=>void
最直接的方法是什么?

谢谢!虽然可变元组方案看起来不错,但我不认为这是我想要的。首先,
不允许我命名参数,这是我最终要寻找的。我可以使用数组实现所需的功能,但它们没有参数名,所以我只是好奇是否可以将对象转换为元组,希望参数是根据对象的键命名的。
这能满足您的要求吗?我认为,在当前的TS中,您想要实现的目标是不可能的。而且,它的使用非常有限,好像您可以仅使用一个参数作为记录,并且在没有spread运算符的情况下,您就拥有了您想要的。检查一下也许会有帮助