我正在尝试将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中映射泛型元组有更深入的了解。
答案 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>;