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/traverseScope#crawl() メソッドが見当たらなかった。

こういうときにどうするか、というと、もちろん DefinitelyTyped にプルリクエストを送るのが一番いいのだが、マージされるまでにはある程度の時間がかかる。こういう場合は、もちろん、@ts-ignore コメントでコンパイルエラーを無視することもできるのだが、

// @ts-ignore
path.scope.crawl();

それよりも、Module Augumentation既存のモジュールの型定義に型定義を追加することができる

これを使って、Scope#crawl() を追加してみる。

declare module "babel__traverse" {
  interface Scope {
    crawl(): void;
  }
}

一時凌ぎではあるが、これでコンパイラのチェックも効くし、そのあいだに DefinitelyTyped にプルリクエストを送ることができる

脚注
  1. TypeScript: Documentation - Introduction ↩︎