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