타입스크립트에서 명명된 타입(named type)을 정의하는 방법은 타입과 인터페이스 두 가지가 있다.
type TState = {
name: string
capital: string
}
interface IState {
name: string
capital: string
}
클래스 역시 명명된 타입을 정의할 때 사용할 수도 있지만, 클래스는 런타임 때 값으로도 쓰일 수 있는 개념이므로 제외하기로 한다.
대부분의 경우에는 타입과 인터페이스 둘 다 사용해도 된다. 그러나 그 차이가 무엇인지는 정확하게 알고 같은 상황에서는 일관성 있게 사용하여야 한다.
참고)
인터페이스 접두사로 I를 붙이는 것은 C#에서 비롯된 관례로 현재는 지양해야 할 스타일로 여겨진다고 함!
명명된 타입은 타입과 인터페이스 둘 중 어느 것으로 정의하든 상태에는 차이가 없다.
타입과 인터페이스에 정의되어 있지 않은 추가적인 속성과 함께 할당하게 되면 동일한 오류가 발생한다.
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'.
*/
}
인덱스 시그니처(참고)는 인터페이스와 타입 모두에서 사용 가능하다.