Item 13 타입과 인터페이스의 차이점 알기

Named Types

타입스크립트에서 명명된 타입(named type)을 정의하는 방법은 다음 두 가지가 있다.

type TState = {
  name: string
  capital: string
}

interface IState {
  name: string
  capital: string
}

참고로 IState, TState처럼 I(인터페이스), T(타입) 접두사를 붙이는 것은 C#에서 비롯된 관례로, 현재는 지양해야 할 스타일로 여겨진다.

대부분 어느 것을 사용해도 되지만, 차이를 분명하게 알고, 같은 상황에선 동일한 방법으로 명명된 타입을 정의해 일관성을 유지해야 한다.

  • 타입은 인터페이스를 확장할 수 있다.

  • 인터페이스는 유니온 타입 같은 복잡한 타입을 확장하지는 못한다.

  • 클래스를 구현(implements)할 때는, 타입과 인터페이스 둘 다 사용할 수 있다.

  • type 키워드는 일반적으로 interface보다 쓰임새가 많다. (유니온, 매핑된 타입, 조건부 타입 등 고급 기능, 튜플, 배열)

  • 인터페이스는 보강(augment) 기능을 지원한다.

interface IState {
  name: string
  capital: string
}
interface IState { // 선언 병합 (declaration merging)
  population: number
}
const wyoming: IState {
  name: 'Wyoming'
  capital: 'Cheyenne'
  population: 500_000
}

Summary

  • 일관되게 인터페이스를 사용하는 코드베이스에서 작업하고 있다면 인터페이스를, 일관되게 타입을 사용 중이라면 타입을 사용하자.

  • 아직 스타일이 확립되지 않은 프로젝트라면, 향후의 보강의 가능성이 있는지 생각해 봐야 한다.

  • 어떤 API에 대한 타입 선언을 작성해야 한다면 인터페이스를 사용하는 것이 좋다. API가 변경될 때 사용자가 인터페이스를 통해 새로운 필드를 병합할 수 있어 유용하기 때문이다.

  • 그러나 프로젝트 내부적으로 사용되는 타입에 선언 병합이 발생하는 것은 잘못된 설계이므로, 이럴 때는 타입을 사용하자.

Last updated