https://www.typescriptlang.org/docs/handbook/declaration-files
타입이 없이 작성된 코드에서 타입을 사용하기 위해서는 declaration file을 이용해서 타입을 선언해줘야한다. 수정할 수 있다면 직접 함수/객체/클래스/변수 등의 선언부에 타입을 추가해줄 수 있겠지만 그렇지 못하다면 .d.ts 파일을 통해 타입을 선언해줄 수 있다.
보통 요즘 자바스크립트 라이브러리들은 이러한 .d.ts
선언 파일을 같이 배포하고 있으며 지원하지 않는 경우에만 직접 작성해주면 된다. 단순히 타입 선언 뿐만 아니라 확장하여 사용할 수도 있다.
ts
로 작성한 것을 js
로 변환할 때 .d.ts
파일을 같이 생성해줄 수도 있다. ts로 패키지를 작성하여 npm에 js 로 배포할 때 해당 속성을 이용할 수 있다.
// tsconfig.json
compilerOptions: {
"declaration": true
}
컴파일 된 js
파일과 같은 위치에 .d.ts
파일이 위치한다.
declare
키워드를 이용하여 타입을 선언한다. 키워드를 가장 앞에 명시해주고 선언과 동시에 타입을 지정하는 것과 똑같이 사용한다. 전역 객체에 대한 구조와 타입을 선언해주고 싶을 때는 namespace를 사용할 수 있다
let g = obj.a;
declare namespace obj {
let a: number;
}
함수나 클래스 같은 것들에 대한 설명도 여기있으나 정말 declare
를 붙이는 것 말고는 처음부터 타입스크립트를 가지고 선언하는 것과 크게 다르지 않으며 이해하기도 어렵지 않을 것이다.
라이브러리에 대한 선언 파일을 구성할 때 해당 라이브러리의 특성을 잘 살피면 구조적으로 잘 선언할 수 있다.
다른 모듈들 보다도 전역 라이브러리의 경우 변수명이 충돌될 수도 있고 의존성을 표시할 때 /// <reference types=”~~”>
를 이용해서 표시하는 등 고려해야할 사항이 더 있다. 변수명 충돌의 경우 선언 파일을 작성할 때 namespace를 지정하여 작성해주는 것을 추천한다.
타입스크립트는 정적 타입을 지정하기 때문에 타입이라는 것은 정적이며 값의 생김새를 정의
값은 런타임에서 주고받는 동적인 특징
네임스페이스는 어떠한 범위를 의미한다. let a: A.B.C
에서 C는 네임스페이스 A.B
의 타입
클래스와 열거형의 경우 타입과 값으로 사용될 수 있는데, 타입을 나타낼 때는 인스턴스를 나타내는 것이고 값으로 사용될때는 해당 클래스의 생성자를 의미한다.
네임스페이스, 인터페이스, 클래스 등의 경우는 여러 선언에 걸쳐 merge 될 수 있다.