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