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

type TState = {
  name: string
  capital: string
}

interface IState {
  name: string
  capital: string
}

클래스 역시 명명된 타입을 정의할 때 사용할 수도 있지만, 클래스는 런타임 때 값으로도 쓰일 수 있는 개념이므로 제외하기로 한다.

대부분의 경우에는 타입과 인터페이스 둘 다 사용해도 된다. 그러나 그 차이가 무엇인지는 정확하게 알고 같은 상황에서는 일관성 있게 사용하여야 한다.

참고)

인터페이스 접두사로 I를 붙이는 것은 C#에서 비롯된 관례로 현재는 지양해야 할 스타일로 여겨진다고 함!

인터페이스 선언과 타입 선언의 비슷한 점

명명된 타입은 타입과 인터페이스 둘 중 어느 것으로 정의하든 상태에는 차이가 없다.

공통점 1 - 정의되어 있지 않은 속성 추가 불가

타입과 인터페이스에 정의되어 있지 않은 추가적인 속성과 함께 할당하게 되면 동일한 오류가 발생한다.

const anyang: TState = {
  name: 'Anyang',
  capital: 'Pyeongchon',
  population: 300000,
  /*
	Type '{ name: string; capital: string; population: number; }' 
	is not assignable to type 'TState'.
  Object literal may only specify known properties, 
	and 'population' does not exist in type 'TState'.
	*/
}

const anyang: IState = {
  name: 'Anyang',
  capital: 'Pyeongchon',
  population: 300000,
  /*
	Type '{ name: string; capital: string; population: number; }' 
	is not assignable to type 'TState'.
  Object literal may only specify known properties, 
	and 'population' does not exist in type 'TState'.
	*/
}

공통점 2 - 인덱스 시그니처 사용 가능

인덱스 시그니처(참고)는 인터페이스와 타입 모두에서 사용 가능하다.