|
| 1 | +/* |
| 2 | + 11 - Tuple to Object |
| 3 | + ------- |
| 4 | + by sinoon (@sinoon) #쉬움 #object-keys |
| 5 | +
|
| 6 | + ### 질문 |
| 7 | +
|
| 8 | + 배열(튜플)을 받아, 각 원소의 값을 key/value로 갖는 오브젝트 타입을 반환하는 타입을 구현하세요. |
| 9 | +
|
| 10 | + 예시: |
| 11 | +
|
| 12 | + ```ts |
| 13 | + const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const |
| 14 | +
|
| 15 | + type result = TupleToObject<typeof tuple> // expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'} |
| 16 | + ``` |
| 17 | +
|
| 18 | + > GitHub에서 보기: https://tsch.js.org/11/ko |
| 19 | +*/ |
| 20 | + |
| 21 | +/* _____________ 여기에 코드 입력 _____________ */ |
| 22 | + |
| 23 | +type TupleToObject<T extends readonly PropertyKey[]> = { |
| 24 | + [key in T[number]]: key; |
| 25 | +} |
| 26 | + |
| 27 | +/* _____________ 테스트 케이스 _____________ */ |
| 28 | +import type { Equal, Expect } from '@type-challenges/utils' |
| 29 | + |
| 30 | +const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const |
| 31 | +const tupleNumber = [1, 2, 3, 4] as const |
| 32 | +const sym1 = Symbol(1) |
| 33 | +const sym2 = Symbol(2) |
| 34 | +const tupleSymbol = [sym1, sym2] as const |
| 35 | +const tupleMix = [1, '2', 3, '4', sym1] as const |
| 36 | + |
| 37 | +type cases = [ |
| 38 | + Expect<Equal<TupleToObject<typeof tuple>, { tesla: 'tesla'; 'model 3': 'model 3'; 'model X': 'model X'; 'model Y': 'model Y' }>>, |
| 39 | + Expect<Equal<TupleToObject<typeof tupleNumber>, { 1: 1; 2: 2; 3: 3; 4: 4 }>>, |
| 40 | + Expect<Equal<TupleToObject<typeof tupleSymbol>, { [sym1]: typeof sym1;[sym2]: typeof sym2 }>>, |
| 41 | + Expect<Equal<TupleToObject<typeof tupleMix>, { 1: 1; '2': '2'; 3: 3; '4': '4';[sym1]: typeof sym1 }>>, |
| 42 | +] |
| 43 | + |
| 44 | +// @ts-expect-error |
| 45 | +type error = TupleToObject<[[1, 2], {}]> |
| 46 | + |
| 47 | +/* _____________ 다음 단계 _____________ */ |
| 48 | +/* |
| 49 | + > 정답 공유하기: https://tsch.js.org/11/answer/ko |
| 50 | + > 정답 보기: https://tsch.js.org/11/solutions |
| 51 | + > 다른 문제들: https://tsch.js.org/ko |
| 52 | +*/ |
0 commit comments