TL;DR
型の情報だけを持つ TypeScript のファイルで、拡張子は .d.ts である。値や型が存在することを宣言するが、実装は持たない。JavaScript を出力せず、型チェックにだけ使われる。
なぜ必要か
JavaScript で書かれたライブラリには型の情報がないので、そのままでは TypeScript から呼び出しを型チェックできない。型宣言ファイルがあれば、型のないコードにも正確な型と補完を付けられる。TypeScript で書いたライブラリを npm で公開するときも、利用者に型を渡すために型宣言ファイルを同梱する。
仕組み
TypeScript の公式ドキュメントでは、.ts は型と実行するコードを持つ実装ファイルで、.d.ts は型の情報だけを持つ宣言ファイルだと区別している。
TypeScript は、JavaScript の標準の API の型宣言を lib.[something].d.ts という名前で同梱している。ブラウザの window や document などの DOM API の型もここに含まれる。標準以外のライブラリの型宣言は、ライブラリの npm パッケージに同梱されているか、DefinitelyTyped から @types のパッケージとして入れる。TypeScript は node_modules/@types の下の型定義を自動で見つける。どちらもなければ、自分で型宣言ファイルを書く。
自分の TypeScript のコードからは、コンパイラオプションの declaration を有効にすると、各ファイルに対応する .d.ts が生成される。
例
declaration: true で次のコードをコンパイルする。
export let helloWorld = "hi"すると、次の型宣言が出力される。
export declare let helloWorld: stringEffective TypeScript の項目 58 では、PgTyped が SQL クエリを実際のデータベースと照合し、入出力の型を持つ型宣言ファイルを生成する例を挙げている。