타입 챌린지 1097 - IsUnion

소파의 벨로그·2025년 3월 31일

타입챌린지

목록 보기
40/131

문제 링크

문제

T를 입력으로 받고, T가 Union 유형으로 확인되는지 여부를 반환하는 IsUnion을 구현하세요

내 풀이

type IsUnionImplement<T,U=T>=T extends U?
                              [Exclude<U,T>] extends [never]?false:true
                              :never
                            
type IsUnion<T> = [T] extends [never]?false:IsUnionImplement<T>

T를 분배법칙으로 사용하기 위해 제네릭을 사용하는 타입을 분리했다.

다만, never는 분배법칙 적용이 되지 않으므로 사전에 분기처리를 해주었다.

Exclude<U,T>를 바로 쓰지 않은 이유는 U를 바로 쓰게 될 경우 U도 분배법칙이 되기 때문이다.

다른 사람의 풀이

type IsUnionImpl<T, C extends T = T> = (T extends T ? C extends T ? true : unknown : never) extends true ? false : true;
type IsUnion<T> = IsUnionImpl<T>;

이런 풀이도 있었다.

T를 분배법칙으로 나누고, C가 T를 확장하는 타입인 경우 true, 아니면 unknown을 준다.

만약 하나라도 unknown인 경우
(분배된 T를 확장해도 C가 안되는 경우
ex) string을 확장해도 number가 될 수 없음,
T가 string|number인 경우를 생각할 것)

유니온 타입의 특성에 따라 (true|unknown===unknown) unknwon이 된다

참고자료

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

0개의 댓글