【入門編】 declarationとemitDeclarationOnlyによる型定義生成 – TypeScript実践ガイド

こんにちは。フロントエンドの現場で長年コードを書いてきたチーフアーキテクトです。

TypeScriptを使い始めると、最初は「型チェックが便利だな」という感動から始まりますよね。でも、いざ「自分でライブラリを作って公開したい」とか「別のプロジェクトで自分のコードを使い回したい」という段階になると、必ずぶつかる壁があります。

それが、「.d.ts(型定義ファイル)」の生成問題です。

今日は、このちょっと取っ付きにくい「型定義ファイル」を、日常の買い物に例えながら、一緒に紐解いていきましょう。大丈夫、仕組みさえ分かれば怖くありませんよ。

—

TypeScriptの「型定義ファイル」ってなにもの?

まず、身近な例え話をしましょう。あなたが「最高に美味しい特製スパイス」を開発したとします。

  • TypeScriptのソースコード(.ts):スパイスのレシピと調理手順が全部書かれた「料理人のための秘密のメモ」。
  • JavaScript(.js):実際に調理された「完成した料理そのもの」。

誰かにこのスパイスを使ってほしいとき、あなたは「完成した料理(JS)」を渡しますよね。でも、相手が「これ、何が入ってるの? アレルギーはない?」と知りたいとき、レシピ全部を渡すと秘密が漏れてしまいます。

そこで登場するのが、型定義ファイル(.d.ts)です。
これは、「このスパイスには、唐辛子と塩と胡椒が入っていますよ。使い方は大さじ1杯です」という「成分表示ラベル」のようなものなんです。

相手は、中身のレシピ(実装)を見なくても、このラベルを見るだけで「安全に、正しく」あなたのコードを使えるようになります。

—

魔法の設定:declaration と emitDeclarationOnly

TypeScriptでこの「成分表示ラベル(.d.ts)」を自動生成するには、`tsconfig.json` という設定ファイルに魔法の言葉を書き込む必要があります。

プロジェクトのルートにある `tsconfig.json` を開いて、以下の設定を確認してみてください。

{
“compilerOptions”: {
// 1. 型定義ファイル(.d.ts)を生成してね!というスイッチ
“declaration”: true,

// 2. JSファイルは出力せず、型定義ファイルだけ欲しい!というときの設定
“emitDeclarationOnly”: true,

// 出力先を指定する(distフォルダの中に型定義をまとめるよ)
“outDir”: “./dist”
}
}

なぜこの2つを設定するのか?

1. `”declaration”: true`
これをONにすると、TypeScriptがコンパイル時に「あ、このコードの型情報を抽出して、別のファイル(.d.ts)に書き出しておこう」と気を利かせてくれます。これがラベル生成のスイッチです。

2. `”emitDeclarationOnly”: true`
実は、最近のフロントエンド開発では、JavaScriptへの変換(トランスパイル)を「Babel」や「esbuild」「SWC」といった、TypeScriptコンパイラよりも圧倒的に速いツールに任せることが多いんです。
「TypeScript先生! あなたは変換はしなくていいから、型定義のラベル作成だけに集中してください!」とお願いするのがこの設定。無駄なJSファイルを生成せず、プロジェクトが散らかるのを防ぎます。

—

実際にやってみよう

例えば、こんなシンプルな関数があったとします。

// src/index.ts

/

  • 挨拶を返すだけのシンプルな関数

/
export const sayHello = (name: string): string => {
return `こんにちは、${name}さん!`;
};

この状態でコマンドラインから `tsc` を実行すると、設定通り `dist/index.d.ts` というファイルが生成されます。中身を覗いてみると……

// dist/index.d.ts

/

  • 挨拶を返すだけのシンプルな関数

/
export declare const sayHello: (name: string) => string;

どうでしょう? 実装の中身は消えて、「`sayHello` という関数があって、引数は文字列、戻り値も文字列ですよ」という情報だけが綺麗に残っていますよね。これが、他の開発者があなたのコードを使うときに役立つ「最強のガイド」になるのです。

—

最後にお伝えしたいこと

最初は「なぜこんな面倒なことを?」と思うかもしれません。でも、この型定義ファイルがあるだけで、他の誰か(あるいは未来の自分)がそのコードを使うときに、エディタが「引数は文字列を入れてね!」と親切に教えてくれるようになります。

「自分の書いたコードが、誰かにとって親切な道具になる」。

これが、型定義ファイルを生成する最大の意義です。最初はエラーが出たり、設定がうまく反映されなかったりと、泥臭いトラブルもあるでしょう。でも、その一つ一つがあなたのエンジニアとしての血肉になります。

分からないことがあれば、いつでも立ち止まって設定を見直してください。あなたはもう、ライブラリ開発者への第一歩を踏み出しています。応援していますよ!

コメント

タイトルとURLをコピーしました