type 과 interface의 가장 큰 차이점은 아래와 같다. type의 경우 중복 선언이 불가한 반면 interface는 중복 선언이 가능하다. 추가적으로 인터페이스가 중복 선언된다고 해서 기존에 인터페이스 내부에 존재하는 필드가 제거되고 새로운 필드로 교체되는 것이 아닌 합쳐 지기 때문에 선언 시 사용된 모든 필드를 사용할 수 있다.
type Pingable1 = { //error Duplicate identifier 'Pingable1'.
ping(): void;
}
type Pingable1 = { //error Duplicate identifier 'Pingable1'.
name : string;
}
interface Pingable2 {
ping(): void;
}
interface Pingable2 {
name : string;
}
위 예제에서는 ping(): void; 이후 name : string; 가 들어간 interface 가 선언 되었는데, ping(): void; 가 사라지고 name : string; 가 교체 되는 것이 아닌 name : string; 기존에 Pingable2에 추가된다고 볼 수 있다. 내부 적으로는 아래와 같은 모양을 가지게 된다고 생각하면 된다.
interface Pingable2 {
ping(): void;
name : string;
}