고급 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 개발자에게 강력한 도구이며, 복잡한 시스템에서도 일관성과 유지 보수를 용이하게 해줍니다. 이런 특성을 이해하고 적절히 활용하면 더 나은 코드 품질과 효율적인 개발 환경을 구축할 수 있을 것입니다.

Subscribe to shimdh.log

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe