3188 - Tuple to Nested Object
给定一个只包含字符串类型的元组类型T和类型U,递归地构建一个对象。
例如:
type a = TupleToNestedObject<['a'], string> // {a: string}
type b = TupleToNestedObject<['a', 'b'], number> // {a: {b: number}}
type c = TupleToNestedObject<[], boolean> // boolean. if the tuple is empty, just return the U type
Solution
type TupleToNestedObject<T, U> = T extends [infer F, ...infer R]
? {
[K in F & string]: TupleToNestedObject<R, U>
}
: U
首先通过 infer 关键字 T extends [infer F, ...infer R] 取出元组类型中的第一个元素类型 F. 如果取不到,则表示传入的元组是空,则直接返回 U
之后使用第一个元素类型 F 构成对象类型结构
{
[K in F & string]: TupleToNestedObject<R, U>
}
F & string 则是用来确保 F 是 string 类型, 如果 F 是 number, 则 F & string 得到的结果会是 never
最后通过递归的形式将数组类型的剩余元素再次传入 TupleToNestedObject 中
需要注意的是, 构造对象类型结构,不能这样写
{
F: TupleToNestedObject<R, U>
}
这是由于 F 作为属性名时,会将 F 直接作为字符串而不是变量。为了动态地将 F 的值作为属性名, 需要通过类型映射的方式定义。