타입스크립트 타입 호환

타입 호환인터페이스클래스함수클래스
avatar
2025.04.10
·
3 min read

타입 호환

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

interface Ironman {
  name: string;
}

class Avengers {
  name: string;
}

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

타입 호환 예제

타입호환은 기본적으로 오른쪽에 있는 타입이 더 많은 속성을 가지거나 구조적으로 더 컸을 때 왼쪽과 호환이 된다.

즉, 구조적으로 더 큰 타입에서는 작은 타입을 지원할 수 없는 것이 타입호환이다.


인터페이스

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

클래스

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

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


함수, 제네릭

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

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

interface NotEmpty<T> {
    data: T,
}
var notempty1: NotEmpty<string>;
var notempty2: NotEmpty<number>;
notempty1 = notempty2;
notempty2 = notempty1;
  • NotEmpty인터페이스의 내부에 data가 존재하고 제네릭에 의해 타입이 정해진다.

  • 따라서, notempty1, notempty2의 구조적인 타입의 차이가 생기기 때문에 서로 호환이 되지 않는다.







- 컬렉션 아티클