[typescript] 타입스크립트에서의 공변성과 반공변성

타입스크립트는 자바스크립트의 상위 집합이며, 정적 타입 시스템을 갖추고 있어 타입 안정성을 제공합니다. 이를 통해 개발자는 컴파일 시간에 오류를 사전에 발견할 수 있습니다. 타입스크립트는 자바스크립트와 호환성을 유지하면서 타입 시스템을 추가하므로 자바스크립트 코드에서 타입스크립트 코드로의 전환에 용이합니다.

공변성과 반공변성

타입스크립트에서는 공변성(covariance)과 반공변성(contravariance)을 제공하여 유연하고 안전한 타입 체계를 제공합니다.

공변성

공변성은 서브타입 관계가 유지되는 경우를 말합니다. 즉, 서브타입은 슈퍼타입을 대체할 수 있습니다.

예를 들어, Animal이라는 상위 타입이 있고, 이를 확장한 DogCat이라는 서브 타입이 있다고 가정해봅시다. 이때, 만약 함수의 매개변수가 Animal이라면, DogCat을 전달할 수 있습니다. 이는 공변성의 예시입니다.

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

function takeAnimal(animal: Animal) {
  // ...
}

takeAnimal(new Dog()); // 공변성
takeAnimal(new Cat()); // 공변성

반공변성

반공변성은 매개변수의 타입 관계가 역전되는 경우를 말합니다. 즉, 슈퍼타입이 서브타입을 대체할 수 있습니다.

예를 들어, 함수의 반환 값이 반공변성을 가집니다. 반환 값을 사용하는 쪽에서는 슈퍼타입을 대신하여 사용할 수 있어야 합니다.

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

function giveAnimal(): Animal {
  if (/* some condition */) {
    return new Dog();
  } else {
    return new Cat();
  }
}

공변성과 반공변성을 효과적으로 활용하여 타입스크립트의 유연하고 강력한 타입 시스템을 활용할 수 있습니다.

이상으로 타입스크립트에서의 공변성과 반공변성에 대해 알아보았습니다.

참고 자료