XXX - Equal
- #TypeScript
- #Type Challenges
WARNING
이 문항은 Type Challenges에 존재하지 않는 문항입니다.
질문
두 타입이 완전히 동일한지 비교하는 Equal<A, B> 타입을 구현하세요.
type A = Equal<1, 1> // true
type B = Equal<1, number> // false
type C = Equal<true, boolean> // false
type D = Equal<{ a: number }, { a: number }> // true
type E = Equal<{ a: number }, { readonly a: number }> // false
// !collapse(1:30) collapsed
/* _____________ 테스트 케이스 _____________ */
import type { Expect } from '@type-challenges/utils'
type cases = [
// primitive & literal
Expect<Equal<Equal<1, 1>, true>>,
Expect<Equal<Equal<1, number>, false>>,
// union
Expect<Equal<Equal<1 | 2, 2 | 1>, true>>,
Expect<Equal<Equal<1 | 2, 1>, false>>,
// object (structural vs modifier)
Expect<Equal<Equal<{ a: number }, { a: number }>, true>>,
Expect<Equal<Equal<{ a: number }, { readonly a: number }>, false>>,
// special case: any
Expect<Equal<Equal<any, any>, true>>,
Expect<Equal<Equal<any, number>, false>>,
]선행 지식
extends는 할당(대입) 가능성을 검사한다.
any extends string ? true : false // true
string extends any ? true : false // true흔히 TypeScript의 타입 시스템은 집합에 비유되곤 하지만, (*에 대하여) any라는 특수 케이스 때문에 완벽히 동일하지는 않다. 따라서 A extends B가 true이고 B extends A가 true라고 이 둘이 동일하다는 동등성을 보장하지는 못한다.