서드파티 라이브러리(예: `express` 또는 `lodash`)의 타입 정의가 불완전하거나, 애플리케이션 특정 요구사항에 맞춰 기존 타입을 확장해야 할 때, TypeScript에서 안전하고 모듈화된 방식으로 이를 처리하는 방법을 설명해주세요. 특히, 전역 선언 확장과 모듈 확장 간의 차이점 및 사용 시나리오를 비교하여 설명해주세요.
힌트 · `declare global`과 `declare module` 구문을 사용하여 전역 또는 특정 모듈의 타입을 확장할 수 있습니다. 확장하려는 대상이 전역 스코프인지, 아니면 특정 모듈의 내보내진 인터페이스인지에 따라 적절한 방법을 선택해야 합니다.
모범답안
네, 좋은 질문입니다. TypeScript에서 서드파티 라이브러리의 타입 정의를 확장하는 방법은 크게 전역 선언 확장과 모듈 확장 두 가지가 있습니다.
전역 선언 확장은 declare global 블록을 사용하여 전역 스코프에 존재하는 타입 정의를 확장하는 방식입니다. 예를 들어, window 객체에 새로운 속성을 추가하고 싶을 때 사용합니다. 하지만 전역 스코프를 오염시킬 수 있으므로 주의해야 합니다.
모듈 확장은 declare module 구문을 사용하여 특정 모듈의 타입 정의를 확장하는 방식입니다. 예를 들어, express 모듈의 Request 인터페이스에 사용자 정의 속성을 추가하고 싶을 때 사용합니다. 이 방법은 특정 모듈에만 영향을 미치므로 전역 스코프 오염을 방지할 수 있습니다.
어떤 방법을 선택할지는 확장하려는 대상이 전역 스코프에 있는지, 아니면 특정 모듈의 내보내진 인터페이스인지에 따라 결정됩니다. 일반적으로 모듈 확장이 더 안전하고 모듈화된 방식이라고 생각합니다. 타입 선언 파일(.d.ts)을 만들어서 확장 내용을 정의하고, tsconfig.json 파일에서 해당 파일을 포함시키는 방식으로 관리하면 더욱 깔끔하게 유지할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 TypeScript 면접 질문
- TypeScript에서 타입 별칭(Type Aliases)과 인터페이스(Interfaces)는 모두 객체 타입을 정의하는 데 사용됩니다. 두 가지의 주요 차이점은 무엇이며, 각각 어떤 상황에서 더 적합한지 설명해 주세요.
- TypeScript의 데코레이터(Decorators)는 무엇이며, 클래스, 메서드, 속성 데코레이터의 기본적인 사용 목적과 실제 애플리케이션에서 어떤 방식으로 활용될 수 있는지 예시를 들어 설명해 주세요.
- 복잡한 비동기 데이터 처리 로직에서, 특정 조건에 따라 반환 타입이 동적으로 결정되는 함수를 TypeScript로 어떻게 안전하게 모델링하고 구현할 수 있을까요? 특히, 제네릭과 조건부 타입을 활용하여 Union Type을 분해하고 재구성하는 고급 기법을 설명해주세요.
- 대규모 모노레포 환경에서 TypeScript 프로젝트를 관리할 때, 빌드 성능을 최적화하고 타입 의존성을 효율적으로 관리하기 위한 `tsconfig.json` 설정 전략에 대해 설명해주세요. 특히 `project references`의 도입 배경, 동작 방식, 그리고 이를 활용하여 얻을 수 있는 이점을 구체적인 예시와 함께 설명해주세요.
- 런타임에 동적으로 생성되는 데이터 스키마(예: JSON Schema)에 대해, 이를 기반으로 TypeScript 타입 추론을 수행하고 컴파일 타임에 유효성 검사를 강화하는 '타입 레벨 프로그래밍' 기법을 어떻게 적용할 수 있을까요? 특히, 타입 가드와 커스텀 유틸리티 타입을 활용하여 복잡한 데이터 구조의 안정성을 확보하는 방안을 제시해주세요.
- TypeScript의 Decorator를 활용하여 메타데이터 기반의 AOP(Aspect-Oriented Programming) 패턴을 구현할 때, 타입 안전성을 어떻게 확보할 수 있을까요? 특히 `reflect-metadata` 라이브러리와 함께 사용될 때, 컴파일 타임에 타입 정보를 활용하여 런타임에 메타데이터를 안전하게 주입하고 사용하는 방법에 대해 설명해주세요.