본문 바로가기
Language/Typescript

타입챌린지 : 2595 PickByType (medium)

by hsloth 2023. 5. 8.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/02595-medium-pickbytype/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

제네릭인자로 받은 타입에 해당하는 속성만 리턴하는 타입이다.

as를 사용할 줄 안다면, 상당히 쉽다.

type PickByType<T extends object, U> = {
  [P in keyof T as T[P] extends U ? P : never]: T[P]
}

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

interface Model {
  name: string
  count: number
  isReadonly: boolean
  isEnable: boolean
}

type cases = [
  Expect<Equal<PickByType<Model, boolean>, { isReadonly: boolean; isEnable: boolean }>>,
  Expect<Equal<PickByType<Model, string>, { name: string }>>,
  Expect<Equal<PickByType<Model, number>, { count: number }>>,
]

 

[P in keyof T as T[P] extends U ? P : never]: T[P] : T의 키 값을 P라고 한다. 그런데(as), T[P]가 U라는 타입이라면, P를 리턴하고 아니라면 never를 리턴한다.