만약 특정 자바스크립트 라이브러리에 대한 @types 패키지가 존재하지 않는다면, 다음 두 가지 방법 중 하나를 선택할 수 있습니다.
직접 .d.ts 파일 작성:
해당 라이브러리의 외부 API를 파악하여 직접 앰비언트 모듈 선언(.d.ts 파일)을 작성합니다 (8장 3절 참조).
이 방법은 라이브러리의 규모가 작거나, 사용하려는 부분이 제한적일 때 유용합니다.
my-lib-declaration.d.ts
declare module 'my-custom-js-lib' { export function doSomething(param: string): number;}
app.ts
import { doSomething } from 'my-custom-js-lib';doSomething('hello');
any 타입으로 사용 (최후의 수단):
정의된 타입이 없어 타입 안정성을 포기하고 any 타입으로 라이브러리를 사용하는 방법입니다.
app.ts
import SomeUntypedLib from 'some-untyped-lib'; // 선언 누락을 허용하는 설정에서는 any이며, strict에서는 오류가 날 수 있음const lib = new SomeUntypedLib();lib.doSomethingElse(123); // 타입 검사 없이 허용
이 방법은 타입스크립트 사용의 이점을 상실하므로 가능한 한 피해야 합니다.
아래 다이어그램은 새 라이브러리를 도입할 때 타입 정의를 찾는 우선순위와, 없을 때 선택지를 비교합니다.
라이브러리 타입 소스 선택
BUNDLED · @TYPES · LOCAL DECLARATION
라이브러리 타입 소스 선택
패키지 자체 선언을 먼저 확인하고, 없을 때 호환되는 @types와 좁은 local declaration을 순서대로 선택하며 runtime shape를 함께 검증한다.
exports types 조건?
PACKAGE — types · typings · typesVersions
자체 declaration 사용
BUNDLED — obsolete @types 제거 확인
compatible package
@TYPES — 지원 API range 검증
좁은 declare module
LOCAL — 실제 export shape만 기술
consumer fixture
COMPILE — module mode에서 resolve
runtime version/shape
SMOKE — 타입과 구현 일치 확인
declaration은 구현을 만들지 않는다. 배포되는 .d.ts가 @types를 참조하면 dependency 배치도 소비자 관점에서 검토한다.
types: 컴파일러가 전역 타입 선언으로 포함할 @types 패키지 목록을 지정합니다. TypeScript 6.0 이상에서 이 옵션의 기본값은 []입니다. 이전 버전은 보이는 타입 패키지를 기본적으로 포함했지만, 명시한 types 목록은 전역에 포함할 패키지를 제한합니다.
"compilerOptions": { "types": ["node", "jest"] // 오직 @types/node와 @types/jest만 포함하고 싶을 때}
버전별 기본값과 명시적 import에 미치는 영향은 공식 types 문서를 함께 확인합니다. 이는 자동 전역 타입의 충돌을 줄이는 설정입니다. JavaScript 번들 크기를 직접 줄이지 않으며 명시적으로 import한 모듈의 타입 해석도 막지 않습니다.
아래 다이어그램은 types와 typeRoots가 전역 타입 선언의 포함 범위를 어떻게 좁히는지 정리합니다.
모듈과 전역 타입 해석 경로
명시적 import의 모듈 해석과 전역 타입 포함은 별도 경로다. types 목록은 import한 모듈의 타입 해석을 차단하지 않는다.
모듈 경로
import한 패키지나 로컬 파일의 선언을 설정에 따라 해석한다.
전역 경로
typeRoots로 루트를, types로 전역에 포함할 타입 패키지를 선택한다.
합류와 진단
두 경로가 타입 환경을 구성한다. 모듈 해석 실패, 전역 이름 누락, 중복 선언, 런타임 경로 불일치를 구분한다.
TypeScript 6.0 이상은 types의 기본값이 []이다. 이전 버전의 기본 자동 포함과 구분하고 필요한 node·jest 등을 명시한다.
@types를 설치할지, 자체 타입을 믿을지, 직접 선언을 둘지 결정할 때는 패키지의 현재 배포 형태와 프로젝트의 전역 타입 범위를 같이 확인해야 합니다.
DefinitelyTyped와 @types는 타입스크립트 생태계의 핵심이며, 자바스크립트와 타입스크립트 간 호환성을 보장하는 중요한 메커니즘입니다.
이를 통해 수많은 기존 자바스크립트 라이브러리를 타입 안전하게 활용할 수 있어, 타입스크립트 도입 장벽을 낮추고 개발 생산성을 높일 수 있습니다.
새 라이브러리는 자체 선언과 export 형식을 먼저 확인하고, 없을 때 호환되는 @types를 찾습니다.