将值数组映射到 Typescript 中的泛型类型
Map array of values to generic type in Typescript
我正在尝试创建一个函数来将字符串值数组映射到 Typescript 中的泛型类型。数组中值的索引与对象中的键具有相同的索引。例如:
我有一个Person
界面
interface Person {
lastName: string;
firstName: string;
}
一组值
const values = ['foo', 'bar']
而期望的结果是 Person
的实例
{
lastName: 'foo',
firstName: 'bar'
}
所需的函数类型应如下所示
const parse = <T extends Record<string, string | undefined>>(values: Array<string | undefined>)<T> => {
...
}
const result: Person = parse(['foo', 'bar']);
将 2 个数组映射到一个对象没有问题,但我希望输入返回的泛型以使事情变得更容易。 Object.keys(T)
或 for key in T
之类的东西不起作用,因此很难获得键的索引。
您可以传递一个具有 100 个属性的泛型和一个具有 5 个值的数组,并且只应分配前 5 个属性,其他属性为 null 或未定义。反之亦然,您可以传递一个具有 3 个属性的泛型和一个具有 100 个值的数组,但只使用前 3 个。该数组可以包含 undefined or null
你必须记住,编译代码时,所有关于类型的信息都会被删除。这意味着在运行时,您的函数将不知道 Person
及其属性。
要编写这样的函数,您需要为其提供一些有关将返回的对象的信息。一种可能的方法是定义 class 而不是接口,并向接受构造函数的函数添加参数。
class Person {
lastName = ""
firstName = ""
}
type Constructor<T> = { new(): T }
function parse<T>(constructor: Constructor<T>, values: unknown[]): T {
const obj = new constructor()
// now you can call Object.keys(obj) and the like
// ...
}
const result = parse(Person, ['foo', 'bar'])
我正在尝试创建一个函数来将字符串值数组映射到 Typescript 中的泛型类型。数组中值的索引与对象中的键具有相同的索引。例如:
我有一个Person
界面
interface Person {
lastName: string;
firstName: string;
}
一组值
const values = ['foo', 'bar']
而期望的结果是 Person
{
lastName: 'foo',
firstName: 'bar'
}
所需的函数类型应如下所示
const parse = <T extends Record<string, string | undefined>>(values: Array<string | undefined>)<T> => {
...
}
const result: Person = parse(['foo', 'bar']);
将 2 个数组映射到一个对象没有问题,但我希望输入返回的泛型以使事情变得更容易。 Object.keys(T)
或 for key in T
之类的东西不起作用,因此很难获得键的索引。
您可以传递一个具有 100 个属性的泛型和一个具有 5 个值的数组,并且只应分配前 5 个属性,其他属性为 null 或未定义。反之亦然,您可以传递一个具有 3 个属性的泛型和一个具有 100 个值的数组,但只使用前 3 个。该数组可以包含 undefined or null
你必须记住,编译代码时,所有关于类型的信息都会被删除。这意味着在运行时,您的函数将不知道 Person
及其属性。
要编写这样的函数,您需要为其提供一些有关将返回的对象的信息。一种可能的方法是定义 class 而不是接口,并向接受构造函数的函数添加参数。
class Person {
lastName = ""
firstName = ""
}
type Constructor<T> = { new(): T }
function parse<T>(constructor: Constructor<T>, values: unknown[]): T {
const obj = new constructor()
// now you can call Object.keys(obj) and the like
// ...
}
const result = parse(Person, ['foo', 'bar'])