더북(TheBook)

기본적으로 타입스크립트는 공변성을 갖고 있지만, 함수의 매개변수는 반공변성을 갖고 있습니다. 이때 TS Config 메뉴에서 strictFunctionTypes 옵션이 체크되어 있어야 합니다. strictFunctionTypes 옵션은 strict 옵션이 체크되어 있을 때 자동으로 활성화됩니다. strictstrictFunctionTypes 모두 체크되어 있지 않다면 타입스크립트는 매개변수에 대해 이변성을 갖습니다.

실제 코드로 테스트해봅시다.

function a(x: string): number {
  return 0;
}
type B = (x: string) => number | string;
let b: B = a;

a 함수를 b 타입에 대입할 수 있습니다. 두 타입의 차이는 반환값뿐입니다. 함수의 반환값 타입을 보면 ba보다 넓은 타입입니다. anumber를 반환하고 bnumber | string을 반환하니까요. a의 반환값을 b의 반환값에 대입할 수 있는 것이죠. 이 관계를 a -> b라고 표현합시다.

여기서 T 타입을 함수<반환값>이라고 생각하면 a -> b일 때 T<a>T<b> 간 관계를 파악하면 됩니다. 코드에서 함수 a를 타입 b에 대입할 수 있으므로 T<a> -> T<b>가 됩니다. 따라서 함수의 반환값은 공변성을 갖고 있다고 볼 수 있습니다.

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