타입 별칭 경계

TypeScript 타입 별칭 조합

type과 interface는 객체 모양을 표현할 때 겹치지만 강점이 다르다. 타입 별칭은 union, tuple, primitive alias, mapped type, conditional type을 이름으로 묶을 수 있고, interface는 객체 계약 확장과 declaration merging에 강하다.

01

표현 대상 확인

객체 계약인지, union이나 tuple 같은 조합 타입인지 먼저 본다.

표현할 수 없는 쪽을 고르면 구조가 꼬인다
02

type 사용

문자열 리터럴 union, 함수 타입, tuple, conditional type, mapped type은 type alias로 묶는다.

조합 표현력이 넓다
03

interface 사용

외부에 공개되는 객체 모양이고 확장이나 merging이 필요한 경우 interface를 검토한다.

라이브러리 augmentation에 유리하다
04

확장 방식 비교

type은 intersection으로 조합하고 interface는 extends로 확장한다.

오류 메시지와 충돌 방식이 다를 수 있다
05

팀 규칙 고정

둘 다 가능한 경우 공개 API와 내부 조합 타입에 대한 팀 기준을 정한다.

일관성이 읽기 비용을 줄인다
Union
선택 가능한 값 상태 문자열, action type, discriminated union에 적합하다.
interface로 직접 표현할 수 없다
Mapped
키 변환 기존 타입의 key를 순회해 optional, readonly, 변환 타입을 만든다.
유틸리티 타입의 기반이다
Conditional
조건부 추론 T extends U ? X : Y 형태로 입력 타입에 따라 결과를 바꾼다.
과하면 읽기 어려워진다
Merging
선언 병합 interface는 같은 이름 선언이 합쳐질 수 있어 확장 API에 쓰인다.
type alias는 재선언할 수 없다

선택 확인

조합 필요 union이나 conditional type이 필요하면 type alias를 쓰는지 확인한다.
확장 필요 외부 확장이나 declaration merging을 의도하면 interface가 맞는지 본다.
공개 API 라이브러리 사용자가 확장할 계약인지 내부 도우미 타입인지 구분한다.