TypeScriptで型定義がないライブラリをどう使う?anyのリスクと回避方法を徹底解説
生徒
「TypeScriptを使っているのですが、インストールしたライブラリに型がないというエラーが出て困っています。」
先生
「それはTypeScriptを学んでいると必ずぶつかる壁ですね。型定義ファイル、いわゆるDefinitelyTypedが用意されていない場合にどう対処するかを学びましょう。」
生徒
「とりあえずanyを使えば動くみたいですが、それだと良くないんですよね?」
先生
「その通りです。anyは便利ですが、TypeScriptの最大のメリットを消してしまいます。安全にライブラリを扱う方法を一緒に見ていきましょう!」
1. 型定義ファイルとDefinitelyTypedとは何か
TypeScriptを使い始めると、型定義(かたていぎ)という言葉をよく耳にします。これは、プログラムの中で使うデータが「数値なのか」「文字なのか」「どんな機能を持っているのか」を説明する設計図のようなものです。
世の中には、JavaScript(ジャバスクリプト)で作られた便利な道具箱、つまりライブラリがたくさんあります。しかし、古いライブラリや、TypeScriptを想定していないライブラリには、この設計図が付いていないことがあります。設計図がないと、TypeScriptは「この道具はどうやって使えばいいの?」と迷ってしまい、エラーを出してしまいます。
そこで登場するのがDefinitelyTyped(デフィニトリータイプド)です。これは、世界中の親切なプログラマーたちが、設計図のないライブラリのために代わりに設計図を作って保管してくれている巨大な倉庫のような場所です。多くの場合、ここから設計図をダウンロードすることで解決できます。
2. 型定義がないライブラリで発生するエラーの正体
ライブラリをインストールして使おうとしたとき、エディタに赤い波線が表示されることがあります。これは「型定義ファイルが見つかりません」という警告です。専門用語ではモジュールが見つからない、あるいは宣言ファイルがないという状態を指します。
TypeScriptは非常に慎重な性格をしています。中身が不明なものをそのまま使わせることを嫌がります。なぜなら、不明なものを使うと、後でプログラムが動かなくなったときに原因を突き止めるのが大変になるからです。パソコンを触ったことがない方にとって、これは「説明書のない家電をコンセントに差そうとしている状態」だと思ってください。火を噴くかもしれないので、TypeScriptがストップをかけてくれているのです。
3. any型を使ってしまうことの大きなリスク
エラーを手っ取り早く消す方法として、any(エニー)型を使うという手法があります。anyとは日本語で「何でも」という意味です。つまり「これは何でもいいよ、チェックしなくていいよ」とTypeScriptに伝える魔法の言葉です。
しかし、この魔法には代償があります。anyを使うと、その部分だけTypeScriptとしての機能が完全に停止し、普通のJavaScriptに戻ってしまいます。これを型安全性が失われると言います。例えば、数字を入れるべき場所に間違えて文字を入れてしまっても、anyにしているとエラーが出ません。そして、プログラムを実行した瞬間に画面が真っ白になったり、エラーで止まったりします。これでは、せっかくTypeScriptを使っている意味がなくなってしまいます。初心者のうちはつい使いたくなりますが、できるだけ避けるべき禁断の果実なのです。
4. 対処法その一 型定義パッケージを探してインストールする
最も正しく、推奨される解決方法は、先ほど紹介した倉庫から設計図を取ってくることです。多くのライブラリには、有志が作成した型定義ファイルが存在します。これをインストールすることで、赤い波線を消すことができます。
通常、ライブラリ名の頭に「@types/」を付けてインストールします。例えば、有名なお絵描きライブラリや計算ライブラリを使う際は、以下のようにコマンドを入力します。これにより、TypeScriptが自動的に設計図を読み込み、入力の補助やエラーチェックをしてくれるようになります。
// 実際にはコマンドライン(黒い画面)で実行しますが
// プログラムの中ではこのように「型」が認識されるようになります。
import * as lodash from 'lodash';
// @types/lodash を入れた後は、lodashの中身が何であるか
// エディタがすべて教えてくれるようになります。
5. 対処法その二 独自の型定義ファイルを作成する
もし倉庫を探しても設計図が見つからなかった場合、自分で「これはこういうものですよ」という簡単な看板を立ててあげる必要があります。これを型定義の自作(じさく)と呼びます。プロジェクトの中に「d.ts」という拡張子のファイルを作成し、そこでライブラリの存在を宣言します。
これは、引越し先の住所が地図に載っていないときに、自分で手書きの地図を書くような作業です。中身を細かく書かなくても「この名前のライブラリは存在しますよ」と一行書くだけで、TypeScriptは納得してエラーを静めてくれます。まずはこの方法でエラーを回避し、徐々に中身の型を詳しくしていくのが上級者への近道です。
// my-library.d.ts というファイルを作って以下のように書きます
declare module 'my-unknown-library';
// これだけで、TypeScriptは「あ、そのライブラリは知ってるよ」と
// 認めてくれるようになります。
6. 型安全を守るための unknown 型の活用術
どうしても型が分からない、でも any は使いたくない。そんな時に便利なのが unknown(アンノウン)型です。これは「何かは分からないけれど、とりあえず存在している」という状態を表します。
any との違いは、その中身を使うときに「これは本当に文字なの?」「数字なの?」と厳しくチェックを求められる点です。初心者のうちは少し面倒に感じるかもしれませんが、このチェックを挟むことで、予期せぬ動作を未然に防ぐことができます。安全性を保ったまま、正体不明のデータを扱うための、プログラミングにおける防護服のような役割を果たします。
let dataFromServer: unknown = "こんにちは";
// dataFromServer.length と直接書くとエラーになります。
// なぜなら、中身が本当に文字(string)か分からないからです。
if (typeof dataFromServer === "string") {
// ここでは中身が文字だと証明されたので、安全に使えます!
console.log(dataFromServer.length);
}
5
7. ライブラリの使用箇所を限定してリスクを抑える
型定義がないライブラリをどうしても使わなければならないときは、そのライブラリをプログラムのあちこちで直接使うのではなく、一つの場所に閉じ込める工夫をしましょう。これをラップすると言います。
自分専用の小さな関数(命令のまとまり)を作り、その中でだけ正体不明のライブラリを使い、外側には自分たちで決めた分かりやすい型を見せるようにします。こうすることで、もし将来そのライブラリに型定義が追加されたり、別のライブラリに乗り換えたりしたくなったときも、一箇所を直すだけで済むようになります。管理のしやすい、丈夫なプログラムを作るための大切な知恵です。
// 型のない古いライブラリを直接使わず、自分で包み紙を作ります
function getSecureData(id: number): string {
// ここで型のないライブラリ(OldLib)をこっそり使う
// 外側からは「数字を入れて文字が返ってくる」というルールだけが見える
const result = (OldLib as any).fetch(id);
return String(result);
}
let myData = getSecureData(123);
console.log("取得したデータ:", myData);
取得したデータ: ユーザー情報
8. エディタの機能を活用して型を推測する
TypeScriptをサポートしているエディタ、特に「Visual Studio Code」などを使っていると、型定義ファイルがなくてもある程度中身を推測してくれることがあります。これを型推論(かたすいろん)と言います。マウスを単語の上に乗せるだけで、どんなデータが入っているかヒントが表示される機能です。
パソコン操作に慣れていない方でも、このヒントを読むだけでプログラミングがぐっと楽になります。型定義がないからといって諦めるのではなく、エディタが出してくれるメッセージに耳を傾けてみましょう。そこに解決のヒントが隠されていることがよくあります。エラーメッセージは怖いものではなく、上達するためのアドバイスなのです。
9. 学習の段階に応じた型の扱い方
最後に、学習を進める上での心構えをお話しします。初心者のうちは、すべての赤いエラーを完璧に消そうとして、何時間も悩んでしまうことがあります。これは非常に素晴らしい姿勢ですが、学習が止まってしまうのはもったいないことです。
基本的には、まずは @types がないか探し、なければ declare module で宣言し、それでもどうしても動かしたいときは、コメントで @ts-ignore と書いて一時的にエラーを無視することも一つの手段です。大切なのは、今自分が「安全ではない方法を使っている」と自覚していることです。知識が増えていくにつれて、その穴を少しずつ埋めていけば大丈夫です。一歩ずつ、確実に理解を深めていきましょう。