질문의 역사:
많은 JavaScript 생태계의 라이브러리는 자체 타입 없이 소스 js 파일만 제공합니다. 외부 또는 커스텀 라이브러리뿐만 아니라 전역 변수에 대한 타입을 설명하기 위해 TypeScript에서는 .d.ts(선언 파일) 확장자를 가진 파일 형식을 구현했습니다. 이는 모든 js 모듈 위의 프로젝트에서 타입 정보를 보장하고 타입 안전성을 제공하는 표준이 되었습니다.
문제:
타입이 정의되지 않은 외부 JS 모듈에 대해서는 TypeScript가 그러한 임포트를 any로 해석해야 하며, 이는 정적 타입 지정의 모든 장점을 잃게 만듭니다: 호출에서의 오류, 존재하지 않는 필드, 잘못된 매개변수는 컴파일을 통과하게 되고, 코드 실행 후에만 발견됩니다. 또한 타입에 대한 자동 완성과 탐색을 할 수 없습니다.
해결책:
선언 파일을 사용하여 모든 JS 코드에 대해 수동으로 타입을 설명할 수 있습니다: 함수, 클래스, 객체, 네임스페이스, 심지어 전역 상수까지. 이렇게 함으로써 프로젝트는 외부 라이브러리의 출처와 관계없이 타입 안전성을 유지할 수 있습니다.
코드 예시:
// hello.d.ts declare module 'hello' { export function sayHello(name: string): string; } // app.ts import { sayHello } from 'hello'; sayHello('TypeScript'); // 타입 안전
주요 특징:
선언 파일에서 함수의 구현을 직접 선언할 수 있습니까?
아니요, 선언 파일에서는 구조와 시그니처만 선언할 수 있으며 구현은 허용되지 않습니다. 함수 본체를 포함시키면 컴파일 오류가 발생합니다.
// 안 됩니다: declare function sum(a: number, b: number) { return a + b; }
소스 패키지에 없는 인기 npm 모듈의 타입은 어디서 찾을 수 있습니까?
DefinitelyTyped 저장소(npm 패키지 @types/<lib>): 거의 모든 인기 패키지는 별도의 npm 모듈 형태로 최신 타입을 가지고 있습니다.
d.ts 파일을 사용하여 전역 변수를 설명할 수 있습니까(임포트 없이)?
예, ambient declarations 메커니즘을 통해 가능합니다. 예를 들어, declare var VERSION: string;. 이는 window.X, 전역 상수 및 변수를 설명하는 데 유용합니다.
** 부정적인 사례 프로젝트에서 타입이 없는 JS 라이브러리를 사용하고 있습니다. 개발자들이 d.ts 파일을 잊고 any를 통해 API에 접근합니다. 라이브러리를 업데이트할 때 버그가 발생합니다: 오래된 호출이 깨지지만 컴파일러는 이를 인식하지 못합니다.
장점:
단점:
** 긍정적인 사례 현재 라이브러리에 대한 자체 d.ts 파일이 개발되어 시그니처가 최신 상태로 유지되어 있으며 IDE에서 자동 완성과 탐색이 사용됩니다.
장점:
단점: