通过泛型在TypeScript中使用元组到对象

时间:2019-07-11 12:16:37

标签: typescript generics tuples

我正在尝试将TypeScript中的元组并集转换为对象,而不会丢失任何类型。

以下是其工作方式的示例:

type Tuples = ["foo", string] | ["bar", boolean] | ["baz", null];

/*
ideally the type would be:
{
  foo: string;
  bar: boolean;
  baz: null;
}
*/
type AsObject = DoSomething<Tuples>;

上述解决方案很简单:

type TupleToObject<T extends [string, any]> = { [key in T[0]]: T[1] };

/*
type is:
{
    foo: string | boolean | null;
    bar: string | boolean | null;
    baz: string | boolean | null;
}
*/
type TypesLost = TupleToObject<Tuples>;

但是我们丢失了一些类型信息,因为所有值都被合并为一个联合类型。

我正在寻找一种使用泛型的解决方案,该解决方案不会丢失此类型信息,并且希望对在TypeScript中映射泛型元组有更深入的了解。

1 个答案:

答案 0 :(得分:1)

您可以使用Extract获得所需的效果。基本思想是,我们将从T中提取与通用key相对应的并集的适当类型:

type Tuples = ["foo", string] | ["bar", boolean] | ["baz", null];
type TupleToObject<T extends [string, any]> = { [key in T[0]]: Extract<T, [key, any]>[1] };

/*
type is:
{
    foo: string;
    bar: boolean;
    baz: null;
}
*/
type TypesLost = TupleToObject<Tuples>;