[typescript] 가변성(Variancy) 문제의 개념

가변성(Variancy)은 타입 시스템의 중요한 개념 중 하나입니다. 특히, 제네릭과 관련하여 자주 다뤄지는 주제 중 하나입니다.

가변성이란 무엇인가?

가변성이란 타입 안정성(Type Soundness)을 유지하기 위한 개념으로, 서로 다른 타입 사이에서 어떤 관계를 허용하는지를 나타냅니다.

대부분의 경우, 다양한 타입 사이에 서로 다른 관계가 있을 수 있는데, 이를 가변성 규칙을 통해 제한합니다.

가변성의 세 가지 유형

  1. 공변성(Covariance)
  2. 반공변성(Contravariance)
  3. 무변성(Invariance)

각 유형은 다음과 같은 관계를 가집니다.

예제를 통한 이해

다음 TypeScript 코드를 통해 가변성의 세 가지 유형을 살펴보겠습니다.

// 공변성 예제
class Animal {}
class Dog extends Animal {}

let arrayOfAnimal: Array<Animal>;
let arrayOfDog: Array<Dog>;

arrayOfAnimal = arrayOfDog; // OK

// 반공변성 예제
function func1(arg: (animal: Animal) => void): void {}
function func2(arg: (dog: Dog) => void): void {}

func2 = func1; // OK

// 무변성 예제
class Box<T> {
  value: T;
}

let box1: Box<Animal>;
let box2: Box<Dog>;

box1 = box2; // Error

정리

가변성 문제는 다양한 제네릭 타입 사이의 관계를 잘 이해하고, 타입 시스템의 안전성을 유지하기 위해 중요한 개념입니다. 올바른 가변성 규칙을 적용하여 타입 안정성을 유지하고, 안전한 코드를 작성하는 데 도움이 됩니다.

더 많은 정보는 타입스크립트 가이드를 참고할 수 있습니다.