Skip to main content

Command Palette

Search for a command to run...

[type-challenges ] Pick / Readonly / Tuple to Object 구현

Published
2 min read

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 }>>,
]

More from this blog

Conductor 워크스페이스마다 .env 파일 자동 복사하기

문제를 만나다 개인 프로젝트를 진행할 때 기능을 병렬로 구현하기 위해서 Conductor를 사용하고 있다. 여러 개의 워크 스페이스를 새로 만들 때마다 환경변수를 매번 수동 복사해야 하는 게 매우 귀찮았다. 워크트리 개념이 익숙하지 않아서 처음에는 워크트리 생성 시 모든 파일을 다 가져오는 줄 알았다. 워크트리의 동작 방식을 찾아보니, git에 저장된 파일만 생성된다는 걸 새로 알게 되었다. 도움 받은 블로그 글 링크 : Git에서 다수...

Dec 28, 20251 min read

[ts-challenges] Includes / Push / Unshift / Parameters

Includes 설계 의도 튜플 타입 T를 첫 번째 요소인 Head와 나머지 요소들인 Tail로 분리해서 추론한다. Head가 제네릭 U 타입과 동일하지 않으면 Includes 타입을 Tail에 대해 재귀적으로 다시 실행하면서 다음 요소 검사하기 boolean 타입의 경우, true와 false이 모두 할당가능하니까 엄격하게 동등한지 비교하기 위해서 Equal 헬퍼함수 사용 코드 type Equal<X, Y> = (<T>() => ...

May 23, 20253 min read

Untitled Publication

37 posts