Second day learning. Not that elegant but I think it works
type TupleToNestedObject<T extends readonly string[], U> = T extends [infer E extends string, ...infer B extends readonly [string, ...string[]]] ? { [P in E] : TupleToNestedObject<B,U> } : T extends [infer A extends string] ? { [P in A] : U } : U;
Solution by Abdel117 #37518
type TupleToNestedObject<T extends string[], U> = T extends [
infer F extends string,
...infer R extends string[]
]
? Record<F, TupleToNestedObject<R, U>>
: U;
Solution by Barrenboat #37302
{ [K in First]: ้ๅฝ่ฐ็จ }
type TupleToNestedObject<T extends unknown[], U> =
T extends [infer First extends PropertyKey, ...infer Rest]
? { [K in First]: TupleToNestedObject<Rest, U> }
: U;
Solution by djdidi #37187
type TupleToNestedObject<Arr extends string[], T extends any> = Arr extends [
infer Prop extends string,
...infer Rest extends string[]
]
? {
[k in Prop]: TupleToNestedObject<Rest, T>;
}
: T;
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
type d = TupleToNestedObject<["a", "b","c","d",'e'], boolean>; // boolean. if the tuple is empty, just return the U type
Solution by Gravity2333 #37076
ๅ
ณ้ฎ็ๆฏK in F
, ่ฟ็นๆๆฒกๆๆณๅฐ๏ผๆไปฅไธบๆฏ็ดๆฅ K
ไฝไธบ้ฎๅผๅฏนๅฐฑ่ก, F
ๆๅๅบๆฅๅ๏ผๆฏไธไธช็ฑปๅ๏ผไฝๆฏไฝไธบ้ฎ๏ผ้่ฆๆฏๅ
ทไฝ็ๅผ
type TupleToNestedObject<T, U> = T extends [infer F, ...infer Rest]
? {
[K in F & string]: TupleToNestedObject<Rest, U>
} : U;
Solution by vaclock #35962
// answer1
type TupleToNestedObject<T, U> = T extends [infer F, ...infer R]
? {
[K in F as F extends string ? F : never]: TupleToNestedObject<R, U>;
}
: U;
// answer2
type TupleToNestedObject<T, U> = T extends [infer F, ...infer R]
? {
[K in F&string]: TupleToNestedObject<R, U>;
}
: U;
Solution by wendao-liu #35055
type TupleToNestedObject<T, U> = T extends [infer First,...infer Rest] ? {
[Key in First&string]: TupleToNestedObject<Rest,U>
} : U
Solution by devshinthant #34950
type TupleToNestedObject<T extends any[], U> = T extends [infer First, ...infer Rest] ? {[k in First&string]: TupleToNestedObject<Rest, U>} : U
Solution by maximallain #34771
type TupleToNestedObject<T extends any[], U> = T extends [infer R, ...infer rest] ? {
[K in R & string]: TupleToNestedObject<rest, U>
} : U
Solution by ouzexi #34056
type TupleToNestedObject<T extends any[], U> = T extends [infer F, ...infer R] ? { [K in F]: TupleToNestedObject<R, U> } : U;
Solution by rookiewxy #33853
// your answers
type TupleToNestedObject<T, U> = T extends [infer F,...infer R]?
{
[K in F&string]:TupleToNestedObject<R,U>
}
:U
Solution by pea-sys #32948
type TupleToNestedObject<
T extends unknown[],
U extends unknown,
Acc extends Record<string, unknown> | U = U
> = T extends [infer F extends string, ...infer Rest extends string[]]
? Rest['length'] extends 0 ? Record<F, U> : Record<F, TupleToNestedObject<Rest, U, Acc>>
: Acc
Solution by ZhulinskiiDanil #32731
type TupleToNestedObject<T extends PropertyKey[], U> =
T extends [infer P extends PropertyKey, ...infer R extends PropertyKey[]]
? Record<P, TupleToNestedObject<R, U>>
: U
Solution by dev-hobin #32524
type TupleToNestedObject<T, U> = T extends [infer F, ...infer Rest]
? {[K in Extract<F, string>]: Rest extends [] ? U : TupleToNestedObject<Rest, U>}
: U;
Solution by kai-phan #32515
type TupleToNestedObject<T extends string[], U> = T extends [infer H extends string, ...(infer R extends string[])]
? { [P in H]:TupleToNestedObject<R, U>}
: U
Solution by keyurparalkar #32477
type TupleToNestedObject<T, U> =
T extends [infer F, ...infer R]
? Record<F extends string ? F : never, TupleToNestedObject<R, U>>
: U
Solution by ricky-fn #32239
type TupleToNestedObject<T, U> = T extends [infer F,...infer R]?
{
[K in F&string]:TupleToNestedObject<R,U>
}
:U
Solution by vipulpathak113 #31818
// your answers
type TupleToNestedObject<T, U> = T extends [infer S extends keyof any, ...infer O] ? {
[P in S]: TupleToNestedObject<O, U>
}: U;
Solution by tarotlwei #31708
type TupleToNestedObject<T extends any[], U> = T extends [infer F, ...infer Rest]
? { [K in F & string]: TupleToNestedObject<Rest, U> }
: U;
Solution by kai-phan #31017
A solution without type-narrowing intersection is
type TupleToNestedObject<T extends any[], U> =
T extends [infer F extends PropertyKey, ...infer R]
? Record<F, TupleToNestedObject<R, U>>
: U
or even shorter
type TupleToNestedObject<T extends any[], U> =
T extends [PropertyKey, ...infer R]
? Record<T[0], TupleToNestedObject<R, U>>
: U
Solution by sbr61 #30114
type ReverseArray<T extends any [], R extends any [] = []> = T extends [infer First, ...infer Rest] ? ReverseArray<Rest, [First, ...R]> : R
type ToRecursivelyObject<T, U, R = U> = T extends [infer First extends keyof any, ...infer Rest] ? ToRecursivelyObject<Rest, U, {[K in First]:R}> : R
type TupleToNestedObject<T extends any [], U> = ToRecursivelyObject<ReverseArray<T>, U>
Solution by sv-98-maxin #29950
type TupleToNestedObject<Arr extends any[],L>=Arr['length'] extends 0?L:{ [P in Arr[0]]:Arr['length'] extends 1? L:TupleToNestedObject<Arr extends [infer A,...infer B]?B:[], L> }
Solution by sunhk123456 #28956
type TupleToNestedObject<T, U> = T extends [infer F extends string, ...infer R] ? { [K in F]: TupleToNestedObject<R, U>; } : U;
Solution by DoubleWoodLin #28699
type TupleToNestedObject<T extends unknown[], U, Acc = U> = T extends [
...infer First,
infer Tail
]
? TupleToNestedObject<First, U, { [Key in Tail]: Acc }>
: Acc;
Solution by idebbarh #28201
// your answers
type TupleToNestedObject<T, U> = T extends [infer F, ...infer R] ? {
[K in F&string]:TupleToNestedObject<R,U>
} : U
Solution by daiki-skm #28058
// your answers
type TupleToNestedObject<T extends any[], U> = T extends [infer F extends string, ...infer Rest] ? Record<F, TupleToNestedObject<Rest, U>> : U
Solution by AAA611 #27878
type TupleToNestedObject<T extends any[], U> = T extends [...infer Prev, infer Last]
? [Last] extends infer L extends any[]
? TupleToNestedObject<Prev, {
[P in L[number]]: U
}>
: never
: U
Solution by jazelly #27846
// your answers
type TupleToNestedObject<T extends string[], U> = T extends []
? U
: T extends [infer First, ...infer Rest]
? First extends string
? {
[key in First]: TupleToNestedObject<
Rest extends string[] ? Rest : [],
U
>;
}
: never
: never;
Solution by wjddlsy #27750
type TupleToNestedObject<T, U> = T extends [...infer O, infer L extends string] ?
TupleToNestedObject<O, {[P in L]: U}> : U;
Solution by 8471919 #27643
type TupleToNestedObject<T extends string[], U> =
T extends [infer P extends string, ...infer Tail extends string[]] ? {
[K in P]: TupleToNestedObject<Tail, U>
} : U
Solution by jjswifty #27633