将值数组映射到 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'])