더북(TheBook)

이러한 점에서 제약은 기본값과 다릅니다. 기본값으로 지정한 타입과 완전히 다른 타입을 제공할 수 있지만, 제약에 어긋나는 타입은 제공할 수 없습니다. 타입 매개변수에 사용하는 extends는 제약을 의미함을 기억하세요.

하나의 타입 매개변수가 다른 타입 매개변수의 제약이 될 수도 있습니다.

interface Example<A, B extends A> {
  a: A,
  b: B,
}
type Usecase1 = Example<string, number>;
// Type 'number' does not satisfy the constraint 'string'.
type Usecase2 = Example<string, 'hello'>;
type Usecase3 = Example<number, 123>;

B 타입 매개변수는 A 타입이어야 한다는 제약이 걸려 있습니다. 타입을 선언할 때는 A 타입이 구체적으로 무엇인지 알 수 없지만 Usecase1, 2, 3와 같이 타입을 사용할 때는 A 타입이 무엇인지 알 수 있습니다. 이때 B의 제약도 구체적으로 정해지게 됩니다. Usecase1에서는 A의 타입이 string이 되었으므로 B의 제약도 string이 됩니다. 그런데 B의 타입으로 number를 넣었으니 에러가 발생합니다. Usecase2Usecase3는 모두 B의 제약을 잘 충족시키는 예시입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.