Skip to main content

3188 - Tuple to Nested Object

Answer TestCases

给定一个只包含字符串类型的元组类型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 则是用来确保 Fstring 类型, 如果 Fnumber, 则 F & string 得到的结果会是 never

最后通过递归的形式将数组类型的剩余元素再次传入 TupleToNestedObject

需要注意的是, 构造对象类型结构,不能这样写

{
F: TupleToNestedObject<R, U>
}

这是由于 F 作为属性名时,会将 F 直接作为字符串而不是变量。为了动态地将 F 的值作为属性名, 需要通过类型映射的方式定义。