고급 TypeScript - 타입 선언 파일: 선언 병합
타입 선언 파일: 선언 병합
타입스크립트에서 타입 선언 파일은 JavaScript 코드의 구조와 타입 정보를 설명하는 데 사용됩니다. 이 파일들은 .d.ts
확장자를 가지며, 주로 외부 라이브러리나 API의 타입을 정의할 때 활용됩니다. 여기서 중요한 개념 중 하나가 선언 병합입니다.
선언 병합이란?
선언 병합은 동일한 이름을 가진 여러 인터페이스나 네임스페이스를 결합하여 하나의 통합된 형태로 만드는 기능입니다. 이를 통해 여러 소스에서 정의된 타입들을 자연스럽게 조화롭게 사용할 수 있습니다.
예를 들어, 두 개의 서로 다른 모듈에서 같은 이름을 가진 인터페이스를 각각 정의했다고 가정해 봅시다. TypeScript는 이러한 경우에 각 인터페이스를 자동으로 병합합니다.
예제 1: 기본적인 선언 병합
// 첫 번째 인터페이스 정의
interface User {
name: string;
age: number;
}
// 두 번째 인터페이스 정의 (같은 이름)
interface User {
email: string;
}
// 결과적으로 다음과 같이 병합됨
const user: User = {
name: "Alice",
age: 30,
email: "alice@example.com"
};
위 예제에서는 User
라는 동일한 이름의 두 개의 인터페이스가 존재합니다. TypeScript는 이 둘을 합쳐서 최종적으로 name
, age
, 그리고 email
속성을 모두 포함하는 새로운 형태로 만들어냅니다.
예제 2: 네임스페이스와 함께 사용하는 경우
네임스페이스 내에서도 선언 병합이 가능합니다. 이는 대규모 애플리케이션이나 라이브러리를 구성할 때 유용하게 쓰일 수 있습니다.
namespace Geometry {
export interface Shape {
area(): number;
}
}
namespace Geometry {
export interface Shape {
perimeter(): number; // 추가 속성
}
}
// 이제 Geometry.Shape는 area()와 perimeter() 메서드를 모두 가짐
class Circle implements Geometry.Shape {
constructor(public radius: number) {}
area() {
return Math.PI * this.radius * this.radius;
}
perimeter() {
return 2 * Math.PI * this.radius;
}
}
위 코드는 Geometry
라는 네임스페이스 안에 있는 Shape
라는 인터페이스에 대해 두 번 정의하고 있으며, TypeScript는 이를 성공적으로 병합하여 사용할 수 있게 합니다.
실용적인 상황에서의 활용
-
라이브러리 확장:
외부 라이브러리를 사용할 때 그 라이브러리에 대한 기존 타입 정의가 있을 수 있습니다. 필요하다면 자신의 프로젝트에서 해당 타입을 추가하거나 수정할 수 있습니다. -
API 응답 모델링:
다양한 API 응답 형식을 다룰 때, 각기 다른 엔드포인트에 대해 공통된 데이터 모델을 만들고 필요한 필드를 추가함으로써 코드 재사용성을 높일 수 있습니다.
결론적으로, 선언 병합 기능은 TypeScript 개발자에게 강력한 도구이며, 복잡한 시스템에서도 일관성과 유지 보수를 용이하게 해줍니다. 이런 특성을 이해하고 적절히 활용하면 더 나은 코드 품질과 효율적인 개발 환경을 구축할 수 있을 것입니다.