使用通用对象的动态函数参数

时间:2019-12-09 06:15:35

标签: typescript

一个广泛记录的通用模式是使用泛型来指定函数的参数类型,例如:

type Func<T> = (arg: T) => void;
let example : Func<boolean>; // function(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<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)

目标是使example看起来像function(a: string, b: number),并在代码提示中包含参数名称(ab)。但是此代码错误,因为T必须是散布运算符的数组。我在寻找一种将对象转换为数组的方法或将其应用于函数参数的替代方法时遇到麻烦。

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

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

0 个答案:

没有答案