🌏global.ts

전역 네임스페이스를 확장하는 global.ts를 소개합니다.

global.ts는 TypeScript에서 전역적으로 사용되는 타입 선언, 인터페이스, 변수 등을 정의하는 데 사용되는 파일입니다. 이 파일은 TypeScript 프로젝트에서 컴파일러에 의해 자동으로 인식되어, 프로젝트 전역에서 사용할 수 있는 사용자 정의 타입을 추가하는 데에 유용합니다.

JavaScript가 생성될 모든 코드에 대해서는 파일 모듈 을 사용하고, global.d.ts 는 컴파일 타임 상수 그리고/또는 lib.d.ts 에 선언되어 있는 표준 타입 선언을 확장하는 용도로만 사용할 것을 권고합니다.

사용 목적

  1. 전역 타입 선언: 프로젝트 내에서 공통적으로 사용되는 타입들을 선언합니다.

  2. 표준 타입 선언을 확장: lib.d.ts 에 선언되어 있는 표준 타입 선언을 확장하는 경우에 사용합니다.

주로 외부 라이브러리를 사용하거나, 타입 정의를 추가할 때 전역 객체인 window에 새로운 프로퍼티를 추가하고 해당 프로퍼티들의 타입을 선언하기 위해 declare global 블록과 interface Window를 사용합니다. 이를 통해 TypeScript가 해당 프로퍼티들의 타입을 알 수 있게 되며

global.d.ts 파일은 컴파일 타임 상수나 라이브러리의 타입을 정의하는 데 사용됩니다. 이 파일에 선언된 내용은 TypeScript 프로젝트 전체에서 사용할 수 있는 전역적인 타입을 확장하거나 추가할 수 있습니다. 주로 다음과 같은 경우에 사용됩니다:

  1. 컴파일 타임 상수 (Compile-time Constants):

    • 프로젝트 전체에서 공유해야 하는 상수 값을 정의할 때 사용됩니다.

    • 예를 들어, 컴파일 타임 상수로 사용할 문자열, 숫자, 불리언 값 등을 선언하여 여러 곳에서 재사용할 수 있습니다.

typescriptCopy code// global.d.ts
declare const MY_CONST: string;
declare const PI: number;
declare const ENABLE_FEATURE_X: boolean;
  1. 라이브러리의 타입 확장 (Extending Library Types):

    • 외부 라이브러리를 사용할 때 해당 라이브러리의 타입을 확장하여 사용자 정의 타입을 추가할 수 있습니다.

    • 이를 통해 외부 라이브러리와 상호작용하면서 타입 안정성을 유지할 수 있습니다.

typescriptCopy code// global.d.ts
declare module 'some-library' {
  export interface CustomData {
    id: number;
    name: string;
  }
}

위의 예시에서 global.d.ts 파일은 컴파일 타임 상수인 MY_CONST, PI, ENABLE_FEATURE_X와 외부 라이브러리인 'some-library'의 타입 확장인 CustomData를 선언하고 있습니다. 이제 이러한 타입들은 프로젝트 어디서든 사용할 수 있게 됩니다.

중요한 점은, global.d.ts 파일에 있는 선언들은 타입 정보만을 제공하며 실제로 변수나 상수의 값을 할당하거나 라이브러리를 로드하는 기능은 포함되지 않습니다. 그저 컴파일러에게 타입 정보를 제공하여 코드의 타입 체크를 도와주는 역할을 수행합니다. 실제 값의 할당이나 라이브러리 로드는 해당 파일을 사용하는 코드에서 처리해야 합니다.

왜 주의해야 하나요?

global.ts 파일에 타입을 선언하는 것에 대해 몇 가지 문제가 있을 수 있습니다.

1. 전역 네임스페이스 오염 (Global Namespace Pollution):

global.ts 파일에 타입을 선언하면 해당 타입이 전역 네임스페이스에 추가됩니다. 이는 다른 파일에서 같은 이름의 타입을 선언할 때 충돌이 발생할 수 있으며, 혼란과 예기치 않은 동작을 초래할 수 있습니다. 특히 여러 명이 협업하는 프로젝트에서는 이러한 문제가 심각해질 수 있습니다.

2. 모듈 시스템의 무시

대부분의 프로젝트에서는 모듈 시스템을 사용하여 코드를 구성하고, 필요한 타입들을 해당 모듈 내부에서 정의합니다. global.ts파일에 타입을 선언하면 모듈 시스템을 우회하게 되어서 원래 목적에 맞지 않는 방식으로 타입들을 사용하게 될 수 있습니다.

3. 의존성 관리의 어려움

global.ts에 타입을 선언하면 해당 타입을 사용하는 모든 파일이 global.ts에 의존하게 됩니다. 이는 프로젝트 규모가 커질수록 의존성을 파악하고 관리하는 것을 어렵게 만듭니다.

4. 테스트 및 유지 보수의 어려움

전역적으로 선언된 타입은 수정이 어려울 수 있으며, 특히 타입의 범위가 매우 넓을 때 변경사항이 예기치 않은 곳에 영향을 미칠 수 있습니다. 또한 특정 모듈에서 사용되는 타입이 어떤 역할을 하는지 파악하기 어려울 수 있습니다.

권장사항

일반적으로 타입들은 해당 모듈의 범위 내에서 선언하는 것이 좋습니다. 현재 저희의 컨벤션이 그렇게 되어있습니다. 이렇게 하면 위에 언급된 문제들을 피할 수 있고, 프로젝트를 보다 안정적으로 유지하고 확장 가능하게 만들 수 있습니다.

Last updated