개요

TypeScript에서 type과 interface는 겹치는 부분이 많지만 용도와 확장 방식이 다름 객체 구조 설계와 복잡한 타입 표현 중 무엇을 우선하느냐에 따라 선택 달라짐 핵심 차이 포인트 중심으로 정리

핵심 개념

  • type

    • 타입 별칭 정의 수단
    • 기본 타입, 유니언, 튜플, 교차 타입 등 복합 표현에 유리
    • 선언 병합 불가
  • interface

    • 객체의 구조 정의 수단
    • 확장과 선언 병합 지원
    • 주로 객체와 클래스와의 계약 정의에 사용
// type 별칭 최소 예시
type ID = number | string
type Point = [number, number]
type Person = { name: string } & { age: number }

// interface 최소 예시
interface User { name: string; age: number }
interface Employee extends User { employeeId: number }

차이점과 동작

  • 표현 범위

    • type은 유니언, 튜플, 조건부 타입, 매핑된 타입 등 고급 타입 구성 가능
    • interface는 객체 중심 표현에 최적화, 유니언/튜플 직접 표현 불가
  • 확장 방식

    • interface는 extends로 계층 설계 용이
    • type은 교차 타입(&)으로 합성, 사실상 객체 타입 확장 대체 가능
    • interface는 객체 형태의 type 별칭을 extends할 수 있으나 유니언 등 비객체 타입은 확장 불가
  • 선언 병합

    • interface는 같은 이름으로 재선언 시 자동 병합 지원
    • type은 동일 이름 중복 정의 불가, 병합 미지원
  • 클래스와의 호환

    • 클래스 implements에는 interface뿐 아니라 객체 형태의 type 별칭도 사용 가능
    • 차이는 선언 병합 가능 여부와 확장 구문 차이에서 발생

장단점

  • type 장점

    • 유니언, 튜플, 교차, 조건부, 매핑된 타입 등 복잡한 타입 모델링에 강함
    • 별칭으로 복잡한 표현 캡슐화, 가독성 향상
  • type 단점

    • 선언 병합 미지원
    • 확장은 교차 타입으로만 구성, 명시적 계층 표현은 제한적
  • interface 장점

    • extends 기반 계층화 용이, 객체 모델 설계에 적합
    • 선언 병합 지원으로 점진적 확장과 모듈 보강에 유리
    • 클래스와의 계약 정의에 직관적
  • interface 단점

    • 유니언/튜플 등 비객체 타입 표현 한계
    • 매우 복잡한 조합형 타입 표현에는 제약

사용 권장

  • interface 권장 상황

    • 도메인 객체 구조 정의 및 계층 확장 필요
    • 라이브러리 타입 공개 시 선언 병합 또는 모듈 보강 가능성이 있음
    • 클래스가 구현해야 할 계약을 명시하고자 함
  • type 권장 상황

    • 유니언, 교차, 튜플 등 복합 타입 모델링 필요
    • 조건부/매핑된 타입 같은 고급 타입 구성 필요
    • 인터페이스로 표현하기 어려운 조합형 타입 단순화 필요
// 인터페이스 계층 최소 예시
interface Shape { area(): number }
interface Rectangle extends Shape { width: number; height: number }

// 유니언 별칭 최소 예시
type Status = 'success' | 'error' | 'loading'

예시로 보는 핵심 포인트

  • 선언 병합은 interface만 가능
interface Profile { name: string }
interface Profile { age: number }
// Profile은 { name: string; age: number }로 병합됨
  • type으로 객체 타입 확장하는 일반 패턴
type Base = { id: string }
type WithTimestamps = Base & { createdAt: Date; updatedAt: Date }

주의 사항

  • interface가 type보다 항상 우월하거나 그 반대는 아님, 모델링 목표에 따라 선택
  • interface는 비객체 타입 확장 불가, type은 선언 병합 불가
  • 클래스 implements에는 객체 형태의 type도 사용 가능, 오해 주의
  • 최신 TS에서 공통 기능이 늘었지만 핵심 차이는 선언 병합과 표현 범위에 남아 있음

요약

  • 객체 구조 정의와 확장, 모듈 보강 필요 시 interface 우선
  • 유니언, 튜플, 교차, 조건부 등 복합 타입 모델링 시 type 우선
  • 팀 컨벤션에 따라 일관성 유지 권장, 특정 케이스에서는 혼용 실무적 선택 유효

참고자료