본문 바로가기
Language/Typescript

타입챌린지 : Equal - 번외

by hsloth 2023. 3. 6.

 
이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
 
타입챌린지에서 항상 사용하는 타입이 있다. 그것은 바로 Equal. 그래서 이 Equal을 뜯어보자.

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

참고로 <T>() => T extends X ? 1 : 2 와 <T>() => T extends Y ? 1 : 2 에서 T는 서로 다른 T이다.
 
<T>() => T extends X ? 1 : 2
T가 X라는 조건을 만족하면 1을 리턴하고 아니면 2를 리턴한다. 따라서 최종적으로 <T extends X>() => 1 혹은 <T>() => 2 가 된다.
 
<T>() => T extends Y ? 1 : 2
이것 또한 마찬가지이다.
 
따라서 최종적으로 (<T extends X>() => 1) extends (<T extends Y>() => 1) 에서 앞의 T는 X를 상속받고, 뒤의 T는 Y를 상속받는데 이 두 함수가 동일하면 true를 리턴하는데, 여기서 두 함수가 동일하게 되는 조건은 X extends Y 이어야 한다.
 
왜냐하면 앞의 T는 X를 extends 하고 뒤의 T는 Y를 extends 하기 때문에 이렇게 변환할 수 있고(사실, 이렇게 변환되지는 않는다는 걸 명심하자. 어디까지나 설명을 위해서일 뿐) (<X>() => 1) extends (<Y>() =>1) 라고 할 수 있으니... 사실상 X extends Y와 같다.
 
그래서 여기서 X extends Y라는 조건이 성립하면 최종적으로 true를 리턴하게 되는 것이다.
 

의문

그러면 type Equal<X, Y> = X extends Y ? true : false; 로 작성해도 되지 않나? 라고 의문을 던질 수 있을 것이다.
그러면 안된다. 그 이유는 위의 Equal을 사용해서  Equal<true, boolean> 을 하면 true가 리턴되는데, true랑 boolean은 엄연히 다른 타입이다. 하지만 보통 X extends Y 에서 X가 더 좁은 범위이고 Y가 더 넓은 범위를 가리킨다.
 
ex) X = { a : 1, b : 2 }, Y = { a : 1 } 이면, Y타입은 { a : 1 } 만 가지면 되는 반면, X타입은 { b : 2 }를 추가적으로 더 가져야하기 때문에 조금 더 구체적이다.
따라서 이 경우, X는 Y를 상속받을 수 있지만(X는 Y라는 조건을 만족하지만) Y는 X를 상속받을 수 없다(Y는 X라는 조건을 만족할 수 없다. b : 2 때문에)
 
<T>() => T extends X 를 해준 것도 같은 이유에서이다. 만약 X가 true라면, T는 true를 조건으로 가지는 타입이지, true가 아니다. 따라서 T는 { true, a : 1 } 같은 타입도 될 수 있다. (조금 억지지만 이해할거라 믿는다)
<T>() => T extends Y 에서 Y가 boolean이라면, T는 boolean을 조건으로 가지는 타입이기 때문에 boolean이 아니라 { boolean, b : 2 } 와 같은 타입도 될 수 있다.
따라서, 결국 앞의 T는 X를 상속받고, 뒤의 T는 Y를 상속받기 때문에 앞의 T는 { true, a : 1 } 타입이 될 수 있고, 뒤의 T는 { boolean, b : 2 }와 같은 타입이 될 수 있기 때문에, 앞의 T와 뒤의 T들은 서로은 상속 관계가 될 수 없다.
그래서 Equal<true, boolean> 은 false가 결과가 나오는 것이다.

해석할 때 다음 블로그를 참고했습니다. 같이보시면 이해하시는데 도움이 될겁니다.
https://kscodebase.tistory.com/643

Equal type 설명하기

[Feature request]type level equal operator · Issue #27024 · microsoft/TypeScript Search Terms Type System Equal Suggestion T1 == T2 Use Cases TypeScript type system is highly functional. Type level testing is required. However, we can not easily check ty

kscodebase.tistory.com

'Language > Typescript' 카테고리의 다른 글

타입챌린지 : 3060-Unshift (easy)  (0) 2023.03.06
타입챌린지 : 3057-Push (easy)  (0) 2023.03.06
타입챌린지 : 898-Includes (easy)  (0) 2023.03.05
타입챌린지 : 533-Concat (easy)  (0) 2023.03.04
타입챌린지 : 268-If (easy)  (0) 2023.03.04