https://github.com/type-challenges/type-challenges
위 레포지토리에서 TypeScript에 대한 공부를 할 수 있다.
이때 타입 테스트를 위해서 사용하는 코드들이 있는데 신기해서 기록을 해두려고 한다.
이 유틸리티 타입을 통해 컴파일 타임에서 타입에 대한 체크를 할 수 있다.
🧩 TOC
A extends B
: typeA
가 typeB
의 하위 타입인가? 즉,A
가B
보다 더 구체적인가?
extends
더 구체적이다, 부분집합이다 라는 뜻type Expect<T extends true> = T;
// 제네릭 타입 T는 반드시 true 타입을 확장하며, 조건 만족 시 T를 그대로 타입으로 반환
type ExpectFalse<T extends false> = T;
// 제네릭 타입 T는 반드시 false 타입을 확장하며, 조건 만족 시 T를 그대로 타입으로 반환
//완전히 동일한 제약 조건을 가져야 함.
export type Equal<X, Y> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2 ) ? true : false;
any
타입의 특별한 동작을 활용하여 정확한 타입 구분이 필요
→ 위 제네릭 타입과 제약조건을 활용한 유틸리티를 동시에 적용하면 되지 않을까? ❎
// any 타입을 제대로 구분하지 못함
type SimpleEqual<X, Y> = X extends Y ? Y extends X ? true : false : false;
type Test1 = SimpleEqual<any, string>; // true
type Test2 = SimpleEqual<string, any>; // true