TypeScript

[TypeScript] 인터페이스 선언 합침 (Declaration Merging)

2025년 11월 27일
2
TypeScriptStudyInterfaceDeclarationMerging

📑 목차

타입스크립트에서 타입 별칭(Type Alias) 은 동일한 스코프 내에서 같은 이름으로 중복 선언하는 것이 불가능하다.

type Person = {
  name: string;
};

// ❌ 에러 발생: 중복된 식별자 'Person'
// type Person = {
//   age: number;
// };

하지만 인터페이스(Interface) 는 가능하다. 심지어 에러가 나지 않을 뿐만 아니라, 알아서 하나로 합쳐진다.

1. 선언 합침이란?

동일한 이름으로 정의된 여러 개의 인터페이스가 컴파일 시점에 자동으로 하나의 인터페이스로 합쳐지는 기능을 말한다.

// 첫 번째 선언
interface Person {
  name: string;
}

// 두 번째 선언 (에러 없음 ✅)
interface Person {
  age: number;
}

위 코드는 내부적으로 다음과 같이 하나의 인터페이스로 합쳐진다.

// 결과적으로 이렇게 됨
interface Person {
  name: string;
  age: number;
}

따라서 Person 타입의 변수를 생성할 때는 두 인터페이스에 정의된 모든 프로퍼티를 구현해야 한다.

const person: Person = {
  name: "조태민",
  age: 25,
};

이 기능은 주로 외부 라이브러리의 기존 타입 정의에 내가 필요한 속성을 추가하고 싶을 때(예: Window 객체 확장 등) 유용하게 사용된다.


2. 주의할 점: 프로퍼티 충돌

인터페이스가 합쳐질 때, 만약 동일한 이름의 프로퍼티가 양쪽에 존재한다면 어떻게 될까?

  1. 타입이 같은 경우: 문제 없다. (그냥 합쳐짐)
  2. 타입이 다른 경우: ❌ 에러가 발생한다 (충돌).
interface Person {
  name: string;
}

interface Person {
  // ❌ 에러 발생!
  // 후속 속성 선언의 타입은 반드시 기존 선언의 타입과 같아야 한다.
  // 'string' 형식이어야 하는데 'number' 형식이다.
  name: number; 
  age: number;
}

첫 번째 Person에서는 namestring으로, 두 번째 Person에서는 number로 정의했다. 이렇게 동일한 프로퍼티를 서로 다른 타입으로 정의하면 충돌로 간주되어 선언 합침이 허용되지 않는다.


요약

  1. 타입 별칭은 중복 선언이 불가능하지만, 인터페이스는 가능하다.
  2. 선언 합침: 같은 이름의 인터페이스는 자동으로 하나로 합쳐진다.
  3. 충돌 주의: 합쳐지는 과정에서 동일한 프로퍼티 이름인데 타입이 다르면 에러가 발생한다.
@taemni

@taemni

안녕하세요, 차근차근 성장 중인 조태민입니다.

instagram

댓글