[typescript] 타입 호환성과 타입 추론

TypeScript는 정적 타입 지정을 통해 안정적인 코드를 작성할 수 있도록 해줍니다. 하지만 때로는 변수나 함수의 타입을 명시적으로 지정하지 않아도 TypeScript가 그 타입을 추론할 수 있습니다. 또한, 타입 호환성을 통해 어떤 타입이 다른 타입과 호환되는지에 대한 규칙을 제공합니다.

타입 추론

TypeScript는 타입 추론을 통해 변수의 타입을 추론합니다. 예를 들어, 다음과 같은 코드를 보겠습니다.

let x = 3;

위의 코드에서 TypeScript는 x의 타입을 number로 추론합니다. 그 이유는 초기 값이 숫자이기 때문입니다.

추론된 타입을 명시적으로 지정하고 싶다면 다음과 같이 할 수 있습니다.

let x: number = 3;

타입 호환성

TypeScript의 타입 호환성(대입 가능성)은 값이 다른 값에 할당될 때 두 값의 타입이 얼마나 일치하는지를 나타냅니다. TypeScript는 구조적으로 타입 호환성을 검사합니다. 즉, 타입의 구조가 호환되면 호환성이 성립합니다.

예를 들어, 다음과 같은 코드를 보겠습니다.

interface Named {
  name: string;
}

class Person {
  name: string;
}

let p: Named;
p = new Person(); // 타입 호환성이 성립

위의 코드에서 Person 클래스는 Named 인터페이스와 구조적으로 호환되기 때문에 p = new Person()이 가능합니다.

다만, 아래의 코드처럼 구조적인 호환성을 만족하지 못할 경우 에러가 발생합니다.

interface Named {
  name: string;
}

let x: Named;
let y = { name: 'Alice', location: 'Seattle' };
x = y; // 에러: 'location'은 'Named'에 존재하지 않습니다.

결론

TypeScript는 변수의 타입을 추론하고, 타입 호환성을 체크하여 유연한 타입 시스템을 제공합니다. 타입 호환성은 코드를 유지보수하기 쉽도록 도와주고, 타입 추론은 코드를 간결하게 작성할 수 있도록 도와줍니다.