Airbnbのエンジニアリングチームは先頃、JavaSciprtコードのTypeScriptへのマイグレーションを支援するツールであるts-migrateをリリースした。生成されたTypeScriptコードをコンパイルする時に、いくつかのアノテーション(// @ts-expect-error
やany
など)を手作業で修正する必要があるが、自動化されたプロセスは、スクラッチから始めるよりもはるかに生産的である。Airbnbチームでは、同社のプロジェクトで1日に50,000行以上のコードを変換したと報告している。
リリースノートには次のように説明されている。
最初にTypeScriptへのマイグレーションを手作業で行った時に、自動化の可能な繰り返し作業があることに気付きました。そこで、これらのステップ毎にcodemod(移行スクリプト)を作成して、それらを組み合わせた包括的なマイグレーションパイプラインを作りました。[…] このパイプラインをベースに作成したツールが"ts-migrfate"です。
Airbnbのエンジニアリングチームは、JavaSciptや一部分がTypeScriptのコードベース全体を1ステップでTypeScriptに変換するという方法が、ファイル単位で行うマイグレーション方法 — TypeScriptが"-allowJSコンフィギュレーションオプションでサポートしている — よりも優れた手法だと考えている。
その理由についてチームは、Airbnbのように大規模なコードベースを扱う場合、段階的なマイグレーションでは作業が長期に及ぶ可能性があるからだ、と説明している。対照的に、全体を一括でマイグレーションする方法であれば、プロジェクト内の一貫性を保証することが可能になる(JavaScriptとTypeScriptが混在しないので、開発者が両方の言語でプログラミングする必要がない)。ただし、次のような注意点もある。
[一括マイグレーションでは]コンパイル時にエラーが発生しないように、
any
型の追加や@ts-ignore
コメントの追加が必要な場合がありますが、後でもっと記述的な型に置き換えることが可能です。
ツールの支援を受ける一括マイグレーションアプローチには、生産性の向上というメリットもある。チームの報告によれば、
[…] codemodを使うことで、50,000行以上のコードと1,000以上のファイルからなるプロジェクトを、JavaScriptからTypeScriptに1日で変換することができました!
ts-migrateはモジュラー形式で設計されており、独自のユースケース(型の品質改善やReactのprops型)にもプラグインで対応することができる。プラグインはマイグレーションコンフィギュレーションに組み込むことが可能で、ts-migrateには2つのデフォルトコンフィギュレーション(migrationとreignore)が同梱されている。reignoreコンフィギュレーションは、エラーをすべて無視することでコンパイルを可能にするもので、まずプロジェクトをマイグレーションしておいて、後で手作業によってエラーを修正する、という方法が可能になる。このコンフィギュレーションは、サードパーティ製ライブラリの型を改善するために、TypeScriptバージョンにアップグレードしたり、あるいは大規模なリファクタリングを行う場合に有効に利用できる。
TypeScriptは現在、AirbnbのフロントエンドWebAsembly開発の公式言語になっている。マイグレーションは現在進行中の作業で、Airbnbのフロントエンドのコードベース(600万コード行)の86パーセントが、TypeScriptへの変換を完了している。リリースでは、コードベースのマイグレーションにおけるts-migrateのメリットを、次のように報告している。
ts-migrateを使うことで、マイグレーションプロセスと生産性が劇的に向上し、型の改善に集中することが可能になりました。
ts-migrateを開発したBrie Bunge氏は、昨年のJSConfでの講演で、TypeScriptへのスイッチには3つの大きな動機があると述べている。すなわち、運用時に発生するバグ数の低減、開発者エクスペリエンスの向上、エンドツーエンドの型安全性(バックエンドからフロントエンドまで)である。バグの事後解析の実施を通じて、Bunge氏は、Airbnbのコードベースにあったバグの38パーセントは、TypeScriptによって防止可能であったと結論付けている。また、GitHubリポジトリからの選択に基づいた研究調査からは、15パーセントのバグがTypeScriptを使うことで防止できる可能性がある、と報告されている。
リリースノートには技術的な詳細や、ts-migrateとプラグインに関するさまざまな情報が数多く含まれている。また、Brie Bunge氏のJSConfでの講演("Adopting Typescript at Scale")では、AirbnbがTypeScriptの採用に至った動機やプロセスが詳細に語られている。