타입 챌린지 16259 - ToPrimitive

소파의 벨로그·2025년 5월 18일

타입챌린지

목록 보기
87/131

문제 링크

문제

리터럴 (라벨 타입)을 원시 타입으로 바꾸어라.

Convert a property of type literal (label type) to a primitive type.

내 풀이

type ToPrimitive<T>=
  T extends boolean?boolean:
  T extends number?number:
  T extends string?string:
  T extends bigint?bigint:
  T extends symbol?symbol:
  T extends ()=>any?Function:
  {[R in keyof T]:ToPrimitive<T[R]>}

우선 배열과 객체를 제외한 모든 타입은 그대로 반환하게 구현하였다.

객체일 경우 mapped type으로 모든 요소들을 재귀적으로 원시형으로 반환한다.

만약 배열일 경우 객체의 경우와 똑같이 동작한다. 다만, 배열의 index가 키 타입으로 들어가는 것이다.

추가
undefined와 null이 빠졌다.

다른 사람의 풀이

type ToPrimitive<T> = T extends object ? (
  T extends (...args: never[]) => unknown ? Function : {
    [Key in keyof T]: ToPrimitive<T[Key]>
  }
) : (
  T extends { valueOf: () => infer P } ? P : T
)

풀이

엄청 멋있는 풀이이다.

모든 원시형의 valueOf는 해당 원시형임을 활용한 풀이이다.

참고자료

https://github.com/type-challenges/type-challenges/issues/22057

0개의 댓글