[type-challenges ] Pick / Readonly / Tuple to Object 구현
Pick<T, K>
설계 의도
K타입은 T 타입의 key만 오도록 제한
Mapped Types 사용해서 제한된 key 타입에 해당하는 타입만 리턴하도록 처리
코드
/* _____________ Your Code Here _____________ */
type MyPick<T, K extends keyof T> = {
[P in K] : T[P]
}
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
// @ts-expect-error
MyPick<Todo, 'title' | 'completed' | 'invalid'>,
]
Readonly<T>
설계 의도
keyof T를 통해 T의 모든 키를 순회하고readony수식어를 붙여서 읽기 전용으로 처리
코드
/* _____________ Your Code Here _____________ */
type MyReadonly<T> = {
readonly [P in keyof T] : T[P]
}
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>,
]
Tuple ot Object
설계 의도
- 튜플의 타입을 순회하기 위해서 Mapped type 사용해야 한다. 이때 튜플의 타입이
any[]이기 때문에T[number]를 사용해서 유니온 타입으로 추출해야 한다.
코드
/* _____________ Your Code Here _____________ */
type TupleToObject<T extends readonly any[]> = {
[K in T[number]] : K
}
/* _____________ 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 }>>,
]