跳到主要内容

Tuple to Object

将一个元组类型转换为对象类型,这个对象类型的键/值和元组中的元素对应。

const tuple = ["tesla", "model 3", "model X", "model Y"] as const;

// expected { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}
type result = TupleToObject<typeof tuple>;

答案

Details
type TupleToObject<T extends readonly any[]> = {
[k in T[number]]: k
}
警告

传入的泛型 T 一定要断言成字面量数组,否则会得到宽泛的 string 或者 number 类型的数组,无法得到正确的转换后的类型结果。

type A1 = [1, 2, 3]; // number[]

type A2 = [1, 2, 3] as const; // [1,2,3]

为什么要断言成字面量数组的类型?因为这样的目的是能准确的得到数组的元素值作为类型。

可以通过 T[number] 得到泛型 T 数组的所有的下标对应的元素类型的一个 Union,再用 in 遍历联合类型的成员即可。