더북(TheBook)

타입 매개변수 TVO 인터페이스라는 제약이 걸려 있고, f 함수의 반환값 타입이 T로 되어 있습니다. returnVO 함수의 실제 반환값 타입인 { value: string }VO 인터페이스와 일치하는데, 왜 에러가 발생할까요?

이것이 바로 타입 매개변수와 제약을 동일하게 생각해서 발생하는 실수입니다. T는 정확히 VO가 아니라 VO에 대입할 수 있는 모든 타입을 의미합니다. 즉, { value: string, another: string }T가 될 수 있습니다. 이러면 { value: string }T가 아닙니다. 따라서 에러가 발생하는 것이죠.

다음 코드도 역시 에러가 발생합니다.

function onlyBoolean<T extends boolean>(arg: T = false): T {
  return arg;
}
// Type 'boolean' is not assignable to type 'T'. 'boolean' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'boolean'.

타입 매개변수 Tboolean 제약이 걸려 있고, 함수의 매개변수도 T 타입인 상황입니다. 그런데 false를 기본값으로 넣으니 에러가 발생합니다. Tboolean이니까 true 아니면 false일 텐데 왜 에러가 발생하는 걸까요?

바로 never 때문에 그렇습니다. never는 모든 타입에 대입할 수 있으므로 never extends boolean은 참입니다. 따라서 Tnever일 수도 있으므로 false를 기본값으로 넣는 것이 불가능한 것입니다.

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