sanguk.dev
작성완료
타입스크립트 타입 호환

타입스크립트 타입 호환

타입 호환은 타입스크립트에서 특정 타입이 다른 타입에 맞는지를 의미하며, 구조적으로 더 큰 타입이 더 적은 속성을 가진 타입과 호환된다. 인터페이스와 클래스의 예를 통해 타입 호환성을 설명하며, 내부 속성과 타입 정의를 비교하여 호환성을 판단한다. 빈 인터페이스는 서로 호환되지만, 데이터가 있는 인터페이스는 구조적 차이로 인해 호환되지 않는다.

TypeScript

타입 호환

타입 호환이란 타입스크립트 코드에서 특정 타입이 다른 타입에 잘 맞는지를 의미한다.

typescript
interface Ironman {
  name: string;
}

class Avengers {
  name: string;
}

let i: Ironman;
i = new Avengers();// OK, because of structural typing

타입 호환 예제

타입호환은 기본적으로 오른쪽에 있는 타입이 더 많은 속성을 가지거나 구조적으로 더 컸을 때 왼쪽과 호환이 된다.
즉, 구조적으로 더 큰 타입에서는 작은 타입을 지원할 수 없는 것이 타입호환이다.

인터페이스

typescript
// 인터페이스interface Developer {
    name: string;
    skill: string
}
interface Person {
    name: string;
}
var developer: Developer;
var person: Person;
developer = person;// 우측에 위치한 person이 developer보다 속성이 더 적기 때문에 에러가 난다.
person = developer;// 오른쪽에 위치한 developer가 구조적으로 더 큰 타입이기 때문에 person을 지원할 수 있다. 호환이 된다.

클래스

typescript
// 클래스interface Developer {
    name: string;
    skill: string
}
class Person {
    name: string;
}
var developer: Developer;
var person: Person;
developer = new person();

타입호환을 통해 타입 스크립트에서 코드 간에 서로 타입이 맞는지 확인할 때는 타입별칭, 인터페이스, 클래스로 확인하는 것이 아니라, 내부적으로 존재하고 있는 속성과 타입에 대한 정의들에 대해 비교한다.


함수, 제네릭

typescript
interface Empty<T> {
// ..
}
var empty1: Empty<string>;
var empty2: Empty<number>;
empty1 = empty2;
empty2 = empty1;

Empty인터페이스의 내부 구조가 비어있기 때문에 empty1, empty2가 서로 호환이 가능한 상태이다.

typescript
interface NotEmpty<T> {
    data: T,
}
var notempty1: NotEmpty<string>;
var notempty2: NotEmpty<number>;
notempty1 = notempty2;
notempty2 = notempty1;
  • NotEmpty인터페이스의 내부에 data가 존재하고 제네릭에 의해 타입이 정해진다.
  • 따라서, notempty1, notempty2의 구조적인 타입의 차이가 생기기 때문에 서로 호환이 되지 않는다.