03188-medium-tuple-to-nested-object

Back

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

  1. ๅ…ณ้”ฎ็œ‹ๅ‡บ่ฟ”ๅ›ž็š„็ฑปๅž‹ { [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