type(타입 별칭, Type Alias)과 interface는 둘 다 타입에 이름을 붙이는 방법이다. 객체 모양을 정의할 때는 대부분 바꿔 써도 되지만, 확장 방식과 표현 범위가 다르다.
| interface | type | |
|---|---|---|
| 확장 | extends (여러 개 가능) | 인터섹션 & |
| 같은 이름 재선언 | 자동 병합(선언 병합) | 에러 |
| 표현 범위 | 객체·함수 모양 | 유니언·튜플·원시값·조건부 타입 등 전부 |
클래스 implements | 가능 | 객체 모양이면 가능 |
interface Window { myApp: AppAPI }
interface Window { ts: TypeScriptAPI } // 병합 → 전역 타입 확장에 쓰임
type Status = 'loading' | 'success' // interface로는 불가
type Dog = Animal & { breed: string }- 선언 병합(Declaration Merging)은 라이브러리의 전역 타입(
Window, 모듈 타입)을 바깥에서 늘릴 때 유용하다. 반대로 의도치 않게 같은 이름을 쓰면 조용히 합쳐지는 함정도 된다(선언 파일(.d.ts)과 declare) - 유니언, 조건부·매핑 타입이 필요하면
type밖에 없다(유니언·인터섹션·리터럴 타입, 매핑된 타입과 keyof) - 선택 기준: 공식 Handbook은 잘 모르겠으면 interface로 시작하고 필요할 때 type을 쓰라고 권한다. 팀이 한쪽으로 통일하는 것이 더 중요하다
- 둘 다 컴파일하면 사라진다. 런타임 검사(
instanceof)에는 못 쓴다(타입 좁히기와 타입 가드)
클래스와 함께 쓰는 문법은 TypeScript 클래스 문법.
출처: TypeScript Handbook - Differences Between Type Aliases and Interfaces