프로그래밍풀스택 개발자

TypeScript에서 인터페이스(interface)와 타입 별칭(type alias)에 대해 설명해 주세요. 이 둘의 차이점은 무엇이며, 어떤 경우에 각각의 접근 방식을 선택해야 할까요?

Hintsage AI 어시스턴트로 면접 통과

답변.

두 메커니즘인 interfacetype alias는 데이터 구조(객체, 함수, 복잡한 타입)를 설명하는 데 사용됩니다.

  • 인터페이스(Interface) — 전통적인 인터페이스 선언입니다. 인터페이스를 확장하고, 선언 병합(declaration merging)을 지원하며, 쉽게 상속할 수 있습니다.
  • 타입 별칭(Type alias) — 새로운 타입 별칭을 생성합니다. 유니언(union) 및 인터섹션(intersection)을 통해 조합할 수 있으며, 원시 타입, 함수, 튜플 등에 할당할 수 있습니다.

차이점:

  • 확장성: 인터페이스는 객체 구조에 더 적합하며, 선언적 병합을 지원합니다.
  • 유연성: 타입 별칭은 범용적이며, 모든 것에 적합합니다: 유니언(|) 및 인터섹션(&).

예시:

interface Animal { name: string } interface Dog extends Animal { bark(): void } // 타입 별칭으로 타입 결합: type MyType = string | number type Cat = Animal & { purr(): void }

권장 사항:

  • 공개 API의 경우 — interface를 사용하세요.
  • 복잡한 결합과 별칭의 경우 — type을 사용하세요.

함정 질문.

질문: 다른 파일에서 타입 별칭으로 정의된 타입에 새로운 필드를 추가할 수 있을까요?

답변:

아니요. 타입 별칭은 다른 파일에서 선언적으로 확장할 수 없으며, 인터페이스와는 다릅니다.

예시:

// main.ts type User = { name: string } // another.ts type User = { age: number } // 오류: 중복 식별자 // 인터페이스: // main.ts interface User { name: string } // another.ts interface User { age: number } // ok, User = { name: string, age: number }

주제에 대한 미세한 차이로 발생한 실제 오류 사례들.


이야기

큰 프로젝트에서 공통 데이터 구조를 타입 별칭으로 정의했습니다. 다른 패키지의 기존 타입에 필드를 추가해야 할 때, 타입 별칭이 선언 병합을 지원하지 않아 인터페이스로 다시 작성해야 했고, 이것이 지연을 초래했습니다.


이야기

한 개발자가 인터페이스를 통해 함수를 설명한 후, 유니언 타입(문자열 또는 함수)을 추가하려고 했습니다. 이로 인해 인터페이스가 이 경우에 적합하지 않다는 것을 알게 되었고, 모든 정의를 타입 별칭으로 변경해야 했습니다.


이야기

인터페이스에서 타입 별칭으로 변경하면서 확장 구문을 혼동했습니다: & 통해 결합하는 대신 extends를 사용하려 했습니다. 오류가 나중에 발생했으며, 그 원인을 즉시 이해하지 못했습니다.