📑 목차
타입스크립트에서 타입 별칭(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. 주의할 점: 프로퍼티 충돌
인터페이스가 합쳐질 때, 만약 동일한 이름의 프로퍼티가 양쪽에 존재한다면 어떻게 될까?
- 타입이 같은 경우: 문제 없다. (그냥 합쳐짐)
- 타입이 다른 경우: ❌ 에러가 발생한다 (충돌).
interface Person {
name: string;
}
interface Person {
// ❌ 에러 발생!
// 후속 속성 선언의 타입은 반드시 기존 선언의 타입과 같아야 한다.
// 'string' 형식이어야 하는데 'number' 형식이다.
name: number;
age: number;
}
첫 번째 Person에서는 name을 string으로, 두 번째 Person에서는 number로 정의했다.
이렇게 동일한 프로퍼티를 서로 다른 타입으로 정의하면 충돌로 간주되어 선언 합침이 허용되지 않는다.
요약
- 타입 별칭은 중복 선언이 불가능하지만, 인터페이스는 가능하다.
- 선언 합침: 같은 이름의 인터페이스는 자동으로 하나로 합쳐진다.
- 충돌 주의: 합쳐지는 과정에서 동일한 프로퍼티 이름인데 타입이 다르면 에러가 발생한다.
