TypeScript の型定義ファイルにないメソッドを追加する
TypeScript でプログラムを書くときに重要なのは…そう、型ですよね?
自分が書いているプログラムは当然 TypeScript で書かれているので、型が定義されている。一方、ライブラリも TypeScript で書かれているのであればいいのだが、もちろん、世の中には型のない JavaScript で書かれたライブラリが多く存在する。その場合、TypeScript の型は .d.ts
というファイルで定義されている[1]。
たとえば、以下のようなモジュールの実装は、
const maxInterval = 12;
function getArrayLength(arr) {
return arr.length;
}
module.exports = {
getArrayLength,
maxInterval,
};
次のような .d.ts
で型を定義できる。
export function getArrayLength(arr: any[]): number;
export const maxInterval: 12;
既存の JavaScript ライブラリには、こうした .d.ts
ファイルが DefinitelyTyped というリポジトリか、ライブラリ自身で提供されているのが現状だ。
型定義ファイルにないメソッド
ところで、DefinitelyTyped で提供されている .d.ts
にはライブラリにあるメソッドが定義されていないことがある。今回、具体的には、@babel/traverse の Scope#crawl()
メソッドが見当たらなかった。
こういうときにどうするか、というと、もちろん DefinitelyTyped にプルリクエストを送るのが一番いいのだが、マージされるまでにはある程度の時間がかかる。こういう場合は、もちろん、@ts-ignore
コメントでコンパイルエラーを無視することもできるのだが、
// @ts-ignore
path.scope.crawl();
それよりも、Module Augumentation で既存のモジュールの型定義に型定義を追加することができる。
これを使って、Scope#crawl()
を追加してみる。
declare module "babel__traverse" {
interface Scope {
crawl(): void;
}
}
一時凌ぎではあるが、これでコンパイラのチェックも効くし、そのあいだに DefinitelyTyped にプルリクエストを送ることができる。
Discussion