답변
type과 interface는 TypeScript에서 객체의 구조를 정의하거나, 타입을 설명하는 데 사용하는 키워드입니다.
객체 리터럴 방식으로 매번 타입을 지정하게 되면 중복 코드가 매우 많아질 것입니다.
type이나 interface를 사용해서 미리 타입을 선언해 두면 필요한 곳에서 타입을 사용할 수 있습니다.
이 두개는 매우 유사하고, 대부분의 경우 자유롭게 선택해서 사용할 수 있으며, 다음과 같은 차이점이 있습니다.
type
type은 type alias(별칭)를 정의할 때 사용됩니다.
동일한 이름으로 type을 재선언하면 에러가 발생하게 됩니다.
&를 사용해서 다른 타입과 합쳐 확장이 가능하며, 유니언/튜플/리터럴 등 모든 타입의 정의가 가능합니다.
type을 사용하면 디버깅 시 에러 메시지에 리터럴한 타입 정의가 직접 표시됩니다.
따라서 복잡한 타입 조합에 유연하다는 특징이 있습니다.
interface
interface는 객체의 구조를 정의할 때 사용됩니다.
이 키워드를 사용해서 타입을 동일한 이름으로 여러 번 선언하면 병합됩니다.
extends로 타입 확장이 가능하며, 유니언 타입으로 직접 선언이 불가합니다.
interface는 이름 기반으로 타입을 추적하기 때문에 디버깅 시 interface의 이름만 표시됩니다.
선언 병합과 상속에 강점이 있는 키워드입니다.
정리
type과 interface는 혼용해도 문제가 없습니다.
다만, 일관된 코드 스타일을 위해서 언제, 어떻게 사용할 지에 대한 팀 컨벤션을 세우는 것이 좋습니다.
| 구분 | type | interface |
|---|---|---|
| 확장 | & 연산자로 합성 가능 | extends로 상속 가능, 다중 상속 지원 |
| 선언 병합 | 불가 | 가능 (같은 이름으로 여러 번 선언 시 병합) |
| 용도 | 원시, 유니온, 튜플 등 모든 타입 정의 가능 | 객체 구조 정의에 최적화 |
| IDE 표시 | 에러 시 타입 정의 전체 노출 | 에러 시 인터페이스 이름만 표시 |
