00011-easy-tuple-to-object

Back

Given:

type TupleToObject<T extends readonly any[]> = any

Considering tuple could be the array of string, number, symbol or a mix of these. In typescript, there's a builtin type called PropertyKey. Now to convert literal types to object types, we can make use of Mapped types using typescript's in keyword.

type TupleToObject<T extends readonly PropertyKey[]> = {
  [P in T[number]]: P
}

Here we are making sure that T is readonly array of PropertyKey (i.e. string | number | symbol). We want keys and its values to be same, so to construct keys of the object we are using indexed access like Array[number] to get the value.

Solution by saurabhdoteth #33615

type TupleToObject<T extends readonly (string | number | symbol)[]> = {
  [P in T[number]]: P
}

Solution by notsecret32 #33606

type TupleToObject<T extends readonly (string  | symbol | number)[]> = {
  [P in T[number]]: P
}

Solution by okasyun #33594

type TupleToObject<T extends readonly (number|string|symbol)[]> = {
  [P in T[number]]: P
}

Solution by Jaewoneeee #33571

type TupleToObject<T extends ReadonlyArray<PropertyKey>> = {
  [K in T[number]]: K
}

Solution by Danny101201 #33562

type TupleToObject<T extends readonly (keyof any)[]> = {
  [E in T[number]]: E
}

Solution by Kolufs #33518

type TupleToObject<T extends readonly any[]> = {
  [K in T[number]]: K
}

Solution by brown2243 #33463

type TupleToObject<T extends readonly PropertyKey[]> = {
  // Array, Tuble을 반복 가능한 구문으로 변경해야 함.
  // T[number]는 T의 모든 요소를 union으로 반환
  // 타입 매핑 구문으로 반복 진행
  [p in T[number]]: p
}

Solution by kukjun #33454

type TupleToObject<T extends readonly any[]> = {[P in T[number]]: P}

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'

const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const
const tupleNumber = [1, 2, 3, 4] as const
const sym1 = Symbol(1)
const sym2 = Symbol(2)
const tupleSymbol = [sym1, sym2] as const
const tupleMix = [1, '2', 3, '4', sym1] as const

type cases = [
  Expect<Equal<TupleToObject<typeof tuple>, { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y' }>>,
  Expect<Equal<TupleToObject<typeof tupleNumber>, { 1: 1, 2: 2, 3: 3, 4: 4 }>>,
  Expect<Equal<TupleToObject<typeof tupleSymbol>, { [sym1]: typeof sym1, [sym2]: typeof sym2 }>>,
  Expect<Equal<TupleToObject<typeof tupleMix>, { 1: 1, '2': '2', 3: 3, '4': '4', [sym1]: typeof sym1 }>>,
]

Solution by happy4 #33391

type TupleToObject<T extends readonly (keyof any)[]> = {
  [p in T[number]]:p
}

Solution by XiaofeiCY #33357

// 你的答案
type TupleToObject<T extends readonly (keyof any)[]> = {
  [key in T[number]]: key 
}

Solution by chenjieya #33355

type TupleToObject<T extends readonly string[]> = {
  [P in T[number]]: P
}

Solution by adultlee #33336

// 여기 풀이를 입력하세요
type TupleToObject<T extends readonly PropertyKey[]> = {
  [K in T[number]]: K
}

Solution by awesomelon #33320

type TupleToObject<T extends readonly any[]> = {
  [P in T[number]]:P
}

Solution by Skytim #33288

type TupleToObject<T extends readonly any[]> = {
  [K in T[number]]: K
}

Solution by daishi-motoyama #33277

// 你的答案
type TupleToObject<T extends readonly any[]> = {
  [key in T[number]]:key
}

Solution by hellolukeding #33203

// 拿 tupleMix 來舉例, 如下:
// [key in T[number]] 等於在 tupleMix 0-4 的 index 當中的 key
// 也就是 1, '2', 3, '4', sym1 *註: sym1 等於具唯一性的 "1"
// 所以再拆開的話就會是 1: 1, '2': '2', 3: 3, '4': '4', [sym1]: typeof sym1

// 約束相對寬鬆的答案
// T 可以是任何類型的 arr (任何 數字、字串、目標...)
type TupleToObject<T extends readonly any[]> = {
  [key in T[number]] : key
}

// 約束相對嚴謹的答案
// T 只能是目標屬性的類型,而目標屬性可以是 string | number | symbol
type TupleToObject2<T extends readonly (keyof any)[]> = {
  [key in T[number]] : key
}

// 使用 TS 的內置方法
// PropertyKey 為 string | number | symbol
// 也就是 T 只能是 string | number | symbol
type TupleToObject3<T extends readonly PropertyKey[]> = {
  [key in T[number]] : key
}

// 錯誤的嘗試
// keyof 是取出目標的 key (目標要是arr or tuple)
// 但 PropertyKey 是一個 Union 而非 arr or tuple,所以不可行
type TupleToObject<T extends readonly (keyof PropertyKey)[]> = {
  [key in T[number]] : key
}

Solution by peznc810 #33174

type TupleToObject<T extends readonly (number | string | symbol)[]> = {
  [P in T[number]]: P
}

Solution by seoksanghwan #33159

type TupleToObject<T extends readonly PropertyKey[]> = {
  [K in T[number]]: K
}

Solution by Tubring25 #33149

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

Solution by loevray #33137

type TupleToObject<T extends readonly (string | number | symbol)[]> = {
  [K in T[number]]: K;
}

Solution by hanseulhee #33124

type TupleToObject<T extends readonly PropertyKey[]> = {
  [P in T[number]]: P
}

Solution by javad7z7 #33053

type TupleToObject<T extends readonly (string|number|symbol)[]> = { [k in T[number]]: k }

// 여기 풀이를 입력하세요

Solution by RanungPark #33034

type TupleToObject<T extends readonly any[]> = {[K in T[number]]: K};

Solution by vantu1998 #33025

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

Solution by jamesngdev #33024

// your answers
type TupleToObject<T extends readonly any[]> = {
  [P in T[number]]: P
}

Solution by lebrancconvas #32925

// your answers
type TupleToObject<T extends readonly PropertyKey[]> = {
  [key in Exclude<keyof T,keyof readonly any[]> as T[key] extends PropertyKey ? T[key]:never]:T[key]
}

Solution by sciencefunq #32911

type TupleToObject<T extends readonly (string | number | symbol)[]> = {
  [K in T[number]]: K
}```

Solution by high-g #32891

type TupleToObject<T extends readonly any[]> = {
  [K in T[number]]: K extends infer U ? U : never
}

Solution by asaringo99 #32839

type TupleToObject<T extends readonly (number | string | symbol)[]> = {
  [V in T[number]]: V;
};

Solution by CAN1177 #32829