kakasoo

IsUnion 본문

프로그래밍/TypeScript

IsUnion

카카수(kakasoo) 2023. 4. 13. 01:01
반응형
type IsPartitionSameEntire<T, P = T> = T extends P ? P extends T ? true : false : false;
type IsUnion<T> = IsPartitionSameEntire<T> extends true ? false : IsPartitionSameEntire<T> extends false ? false : true;

조금 지저분한 풀이긴 하지만, 분산 법칙을 이용해서 푸는 방법이 있다.
Equal 타입을 구현하다가 안 것인데,

type Equal<X, Y> = X extends Y ? (Y extends X ? true : false) : false;

type a5 = Equal<1 | 2, 1>; // boolean
type a6 = Equal<1, 1 | 2>; // boolean

Equal을 다음과 같이 X가 Y일 때 Y도 X인 경우로 구분하게 되면 유니온 타입의 경우에는 boolean으로 추론되는 것을 알았다.
이 때의 경험으로, 나는 유니온이 두 번의 분산법칙을 만나면 두 가지 케이스가 모두 통과하는 경우가 발생하여 true | false, 즉 boolean으로 추론됨을 알았다.
따라서 IsPartionSameEntire는 어떤 타입 T가 분산법칙을 만났을 때 P에 속하면서 P 역시 T에 속하는가, 즉 분산법칙이 발생했는가를 보려고 만든 타입이다.
이 타입의 결과는 당연 true, false 둘 중 하나지만 유니온의 경우에는 boolean이 발생하게 된다.
따라서 IsUnion 타입은 IsPartitonSameEntire 타입의 결과가 boolean으로 추론될 때를 true를 반환하게 하면 된다.

반응형