TypeScript のテンプレートリテラル型がコード生成不要のProtobuf推論を可能にするが、その代償は?

BigGo Editorial Team
TypeScript のテンプレートリテラル型がコード生成不要のProtobuf推論を可能にするが、その代償は?

開発者コミュニティでは、 Protocol Buffer ( protobuf )のメッセージ定義からコード生成なしで TypeScript の型を推論する新しいプルーフオブコンセプトライブラリ「 protobuf-ts-types 」について話題になっています。技術的には印象的ですが、このアプローチは TypeScript の型システムを限界まで押し広げることの実用的な影響について議論を巻き起こしています。

パーサーとしての TypeScript の型システム

開発者 Nathan Leung が作成したこのライブラリは、 TypeScript のテンプレートリテラル型を使用して、型システム内で直接 protobuf メッセージ定義を解析します。このアプローチにより、 protobuf を使用する際に通常必要とされる別個のコード生成ステップが不要になります。実装は驚くほど簡潔で、あるコメンターは「ソースがこれほど小さいのは驚きです。型で実装された巨大で複雑な解析ライブラリを予想していました」と述べています。

このアプローチが特に興味深いのは、 TypeScript の型システムの成長する能力を示している点です。このライブラリは本質的に TypeScript の型システム内にパーサーを実装しており、型レベルでの複雑な文字列操作にテンプレートリテラル型がどのように使用できるかを示しています。

パフォーマンスの懸念と実用的な応用

技術的な成果にもかかわらず、多くの開発者はこのようなアプローチの実用的な応用について懸念を表明しています。議論で提起された主な問題は、コンパイル時間と開発者体験へのパフォーマンスの影響です。

「テンプレートリテラル型がどれほど柔軟かは素晴らしいですが、このような奇抜なことが本番アプリケーションでコンパイル時間を遅くしているとは想像できません。」

この意見は、実際のプロジェクトでこのような複雑な型レベルの操作を使用する場合の IDE の応答性とビルドパフォーマンスを心配する複数のコメンターによって共有されました。おもちゃのような例では適切に機能するかもしれませんが、いくつかの開発者は、より大きなコードベースでは、このアプローチが開発体験を著しく低下させる可能性があると指摘しています。

制限と代替アプローチ

このライブラリにはいくつかの注目すべき制限があります。現在、サービス、RPC、oneofフィールド、マップフィールド、または他のprotoファイルからのインポートをサポートしていません。さらに、 TypeScript コード内にインラインのproto文字列が必要であり、これは複数の言語間でproto定義を維持する上で課題を生み出します。

議論の中で多くの開発者は、本番環境での使用には従来のコード生成アプローチがまだ望ましいかもしれないと提案しました。コード生成ツールは、IDEが処理しやすく、開発中に複雑な型レベルの計算を必要としない静的な TypeScript 型を作成します。

また、一部のコメンターは、 TypeScript のみのプロジェクトでは、 protobuf を使用するよりも TypeScript で直接型を定義する方が簡単かもしれないと指摘し、「 TypeScript の型システムは Protobuf システムよりもはるかに強力なので、 TypeScript で型を定義してそこからprotoを生成する方が好ましい」と述べています。

protobuf-ts-types の主な制限点

  • servicerpc のサポートなし(message のみサポート)
  • oneof フィールドと map フィールドのサポートなし
  • proto ファイル間の import のサポートなし
  • TypeScript コード内にインラインの proto 文字列が必要
  • 大規模プロジェクトでは IDE のパフォーマンスとコンパイル時間に影響を与える可能性あり
  • 概念実証段階であり、本番環境での使用には適していない

TypeScript の型システムの進化

このライブラリをめぐる議論は、 TypeScript エコシステムにおけるより広範なトレンドを浮き彫りにしています:型システムがそれ自体でプログラミング言語として使用されるようになってきています。いくつかのコメンターは他のメタプログラミングシステムとの類似点を指摘し、「プリプロセッサの型システムをチューリング完全なメタ言語に変えるために、これほど多くの努力を費やしている」と述べています。

この進化には支持者と批評家の両方がいます。支持者は、高度な型機能が複雑な JavaScript パターンを記述するためにもたらす柔軟性とパワーを評価しています。批評家は、型システムが複雑になりすぎ、混乱するエラーメッセージや開発者体験の低下につながることを懸念しています。

言及された潜在的な将来の改善点の一つは、タグ付きテンプレートリテラルでの型推論に対する TypeScript の可能なサポートでした。これにより、 protobuf 定義のような埋め込みドメイン固有言語を扱う際のより優雅な構文が可能になるでしょう。

結論として、 protobuf-ts-types は TypeScript の型システム機能の印象的な技術的成果を示していますが、コミュニティは日常の開発においてそのようなアプローチが実用的かどうかについて意見が分かれたままです。このプロジェクトは、興味深いプルーフオブコンセプトであると同時に、 TypeScript の進化の方向性についての会話のきっかけとなっています。

参照: protobuf-ts-types