타입 챌린지 4179 - Flip

소파의 벨로그·2025년 4월 21일

타입챌린지

목록 보기
61/131

문제 링크

문제

just-flip-object의 타입을 구현하라.

Implement the type of just-flip-object

내 풀이

type Flip<T extends object> = {[R in keyof T as  T[R] extends string | number | bigint | boolean | null | undefined?`${T[R]}`:never]:R}

문자열 리터럴 타입을 이용해서 flip을 구현했다

T[R]의 타입이 문자열에 할당가능한지를 확인한다

다른 사람의 풀이

type Flip<T extends Record<any, any>> = {
  [key in keyof T as T[key] | `${T[key]}`]: key;
};

해당 풀이

제네릭 제한에 Record를 걸어두니 `${T[R]}`을 해도 문제가 생기지 않았다

관련 개념

제네릭 제한에 Record를 걸어두니 `${T[R]}`을 해도 문제가 생기지 않는 이유를 알아봤다

그 이유는 any인 듯 하다.

타입스크립트 공식 문서에 따르면, any는 타입 검사를 우회하는 역할을 한다.

리터럴 문자열 타입에는 string | number | bigint | boolean | null | undefined만 들어갈 수 있고, 리터러 문자열에 타입을 넣기위해 템플릿 리터럴을 사용하면
상기의 타입이 맞는지 타입 검사를 한다.

내가 찾아본 풀이에서는 Record<any,any>를 통해 타입검사를 우회해 템플릿 리터럴에 T[R]을 넣을 수 있게 되었다고 이해했다.

참고자료

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

https://www.typescriptlang.org/docs/handbook/basic-types.html#any

0개의 댓글