리터럴 (라벨 타입)을 원시 타입으로 바꾸어라.
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