ベスト
AIシステムの構築に最適なJavaScript & TypeScriptフレームワーク10選 (11月 2026)
Unite.AIは、レビュー製品へのリンク利用により報酬を受け取る場合があります。これは当社の編集評価に影響しません。 アフィリエイト開示をご覧ください。

要点Vercel AI SDK excels at connecting model behavior to responsive interfaces but…
もっと見る
- Vercel AI SDK excels at connecting model behavior to responsive interfaces but persistence and deployment still need explicit design.
- LangGraph suits long-running stateful agents because durable execution demands deliberate handling of retries and external side effects.
- Transformers.js runs supported pretrained models in JavaScript but browser inference depends on model size and device memory.
最適なJavaScriptまたはTypeScriptのAIフレームワークは、アプリケーションで何を実現するかによって異なります。モデルの応答をWebインターフェースにストリーミングすること、状態を保持するエージェントを連携させること、非公開のドキュメントを検索すること、ユーザーのデバイス上でモデルを実行することには、それぞれ異なるツールが必要です。候補を絞ったリストでは、こうした違いを明確にする必要があります。
2026年10月時点の公式ドキュメント、対応するワークフロー、統合要件、デプロイ方法、実用上の制約に基づき、これら10のプロジェクトを独自に評価しました。これは編集上の評価であり、新たに実施した実機ベンチマークではありません。アプリケーション向けの生成AIではVercel AI SDKが有力ですが、オーケストレーション、検索、ローカル推論に最適な選択肢は、アーキテクチャによって異なります。
このリストには、AIシステムの相互補完的な部分を担うフレームワーク、SDK、推論ライブラリを掲載しています。それぞれは互換ではなく、複数を併用するのが適切な場合もあります。エージェントに対応しているというだけでフレームワークを積み重ねるのではなく、明確な要件を満たす最小限の構成から始めましょう。
JavaScript・TypeScript向けAIフレームワークを比較
| AIツール | 最適な用途 | 機能 |
|---|---|---|
| Vercel AI SDK | WebアプリケーションでのAI機能のストリーミング | プロバイダーアダプター、構造化出力、ツール、エージェント、UI統合 |
| LangChain.js | 組み合わせ可能なエージェントとモデル統合 | モデルインターフェース、ツール、ミドルウェア、LangGraphを基盤とするエージェント |
| Mastra | TypeScriptエージェントとワークフローを統合 | エージェント、ワークフロー、メモリ、ストレージ、Studio、トレースと評価 |
| LangGraph.js | 状態を明示的に管理するエージェントオーケストレーション | グラフ、永続化、中断、ストリーミング、決定論的な処理とエージェント型の処理 |
| Google Genkit | 開発ツールを統合したAIアプリケーションのフロー | モデル統合、ツール、構造化データ、フロー、トレースの確認 |
| LlamaIndex TypeScript | ドキュメントやナレッジを中心とするアプリケーション | データコネクター、インデックス、検索機能、エージェント、イベント駆動型ワークフロー |
| Transformers.js | JavaScriptでの事前学習済みモデルの推論 | タスク用パイプライン、テキスト・画像・音声、ONNX Runtime、ブラウザーとNode.js |
| ONNX Runtime Web | ブラウザーアプリケーションでのカスタムONNX推論 | 推論セッション、テンソル、WebAssembly、オプションの高速実行 |
| TensorFlow.js | JavaScriptでのカスタムモデルの学習と推論 | JavaScriptモデルAPI、転移学習、ブラウザーとNode.jsでの実行 |
| MediaPipe Tasks for Web | タスクに特化したオンデバイス認識 | すぐに使えるモデル、画像・音声タスク、Webデプロイ用API |
1. Vercel AI SDK
Web製品にモデルを活用した機能を追加するTypeScriptチームには、Vercel AI SDKを最初におすすめします。生成、構造化された結果、ツール、エージェントに共通のインターフェースを提供するほか、ストリーミング応答を表示するためのUIユーティリティも備えています。特に力を発揮するのは、アプリケーションとの接点です。機能ごとにプロバイダー連携やストリーミング処理を一から構築せずに、モデルの動作を応答性の高いインターフェースにつなげられます。
現行のドキュメントでは、Core、UI、ハーネスが区別されています。この違いを把握すれば、モデルの呼び出し、出力の表示、既存のエージェントハーネスとの統合のいずれが必要かに応じて選択できます。共通インターフェースがあると試行錯誤しやすくなりますが、対応する入力、ツールの動作、出力の制約はプロバイダーごとに異なります。アダプターの切り替えは移行の出発点にすぎず、アプリケーションの動作が同一に保たれる保証にはなりません。
TypeScriptでの開発のしやすさとストリーミングが重要となる、チャット、ドキュメント支援、その他の対話型製品機能に適しています。ただし、永続化、認可、検索品質、デプロイ上の制限については、引き続き明確に設計する必要があります。別のオーケストレーションフレームワークを追加する前に、範囲を限定したツールループで要件を満たせるかを確認しましょう。AI SDKを首位に選んだのは、アプリケーション開発を便利にするためであり、あらゆるワークフローエンジンやモデルランタイムに取って代わるという意味ではありません。
メリットとデメリット
- サーバーの出力とUIを強力に連携
- 複数のモデルプロバイダーで共通のインターフェースを利用可能
- 構造化された結果とツールベースのアプリケーションに対応
- プロバイダーごとに利用できる機能が異なる
- 永続化とデプロイのアーキテクチャは別途検討が必要
2. LangChain.js
LangChain.jsは、設定可能なエージェントと複数のモデルプロバイダーとの連携を必要とするJavaScriptおよびTypeScriptアプリケーションに適した選択肢です。現在のエージェント抽象化では、モデル、ツール、指示、ミドルウェアを組み合わせることで、開発者はアプリケーションに必要な動作を組み立てられます。特に、モデル主導のワークフローに複数の外部システムを組み込む場合に役立ちます。
LangGraphとの関係は重要です。LangChainのエージェントは内部でLangGraphを使用しますが、開発者はより低いレベルで制御するために、LangGraphを直接選ぶこともできます。両者は完全に独立した選択肢ではなく、関連するレイヤーです。同様に、LangSmithによるトレーシングと評価も、より広いエコシステムの一部です。すべてのアプリケーションで特定のホステッド環境を使う必要がある、という要件と混同しないようにしてください。
まずは少数のツールから始め、入出力と失敗時の動作を明確にしましょう。ミドルウェアを使えばポリシーやリクエスト処理を整理できますが、抽象化によって、デバッグ時にチームが理解しておくべき概念も増えます。連携機能と設定可能なエージェントの実行ループによって、相応の作業を削減できる場合にLangChain.jsをおすすめします。単純なモデル呼び出しであれば、直接SDKを使うほうが分かりやすい場合があります。一方、通常とは異なる状態遷移が必要なら、LangGraphを使うことで実行をより意図的に制御できます。
メリットとデメリット
- エージェントとツールを柔軟に設定できる抽象化
- 幅広いモデルとの連携に対応する設計
- LangGraphやトレーシングツールと連携
- 抽象化が増えることでデバッグの負担も増加
- 単純なモデル呼び出しにはフレームワークが不要な場合もある
3. Mastra
Mastraは、エージェント、ワークフロー、メモリ、開発支援ツールを一貫したプロジェクト構成にまとめたいチーム向けのTypeScriptフレームワークです。ドキュメントでは、ストレージ、サーバー連携、デプロイ、トレーシング、メトリクス、評価について説明しています。また、Studioにはアプリケーションを調査するためのインターフェースが用意されています。単一のテキスト生成エンドポイントを追加するのではなく、エージェントサービスを構築する場合に魅力的な選択肢となります。
連携ガイドでは一般的なウェブおよびサーバーの技術スタックを取り上げているため、既存の製品にエージェント機能を組み込めます。設計上の課題は、どの判断をモデルに委ね、どの処理を明示的なワークフローのステップとして残すかです。たとえば、リクエストの解釈にはモデルを使い、検証、アカウントの照会、許可された状態変更には、決定論的なアプリケーションコードを使うことができます。
統合されたアプローチにより、組み立てにかかる作業を減らせますが、アプリケーションのより広い範囲がフレームワークの抽象化に依存することにもなります。スタック全体を採用する前に、ストレージアダプター、認証の境界、デプロイ時の動作を確認してください。開発環境の一貫性を重視し、相応のエージェント処理を運用する予定のあるTypeScriptチームには、Mastraをおすすめします。追加のワークフロー機能や状態管理が不要なアプリケーションなら、より小規模なSDKを選ぶのも妥当です。
メリットとデメリット
- エージェント開発のための統合された環境
- ワークフロー、メモリ、ストレージの各概念を備える
- Studioと可観測性ツール
- フレームワークの広範な採用により依存関係が強まる
- 本番環境での動作は、設定したストレージとデプロイ方法に左右される
4. LangGraph.js
実行制御が主な課題である場合、LangGraph.jsがここで最も適した選択肢です。永続化、ストリーミング、人による介入に対応し、長時間実行されるステートフルなエージェントのための、より低レベルなオーケストレーションフレームワークを提供します。開発者は、予測可能なアプリケーションの処理とモデル主導の判断をグラフ内で組み合わせられるため、AIがワークフローに影響する箇所を特定しやすくなります。
LangChainと緊密に連携していますが、LangChainを使わずに利用することもできます。一般的なツール呼び出しのループには、より高レベルなLangChainのエージェント抽象化を選びましょう。一方、分岐、一時停止と再開の動作、カスタムの状態遷移を明示的に扱う必要がある場合は、LangGraphを直接使うのが適しています。レビュアーの応答を待ち、保存済みの状態から処理を再開するワークフローは、単一のツールを使うだけのシンプルなチャットボットよりも、説得力のあるユースケースです。
実行を確実に継続できるようにするには、アプリケーションを慎重に設計する必要があります。適切な状態を永続化し、用途に合ったストレージバックエンドを設定したうえで、リトライによって外部へのアクションが誤って繰り返されないようにしてください。中断なく正常に完了するケースだけでなく、ステップの途中で再起動するケースもテストしましょう。LangGraphは、導入のしやすさよりも制御性を重視して評価しています。状態管理と復旧が中心的な要件であれば、追加の構造によるメリットが得られますが、短時間で完了するステートレスなリクエストでは、不要な負担になる場合があります。
メリットとデメリット
- ワークフローと状態を明示的に制御できる
- 永続化と人による介入に対応
- 決定論的なステップとモデル主導のステップを組み合わせられる
- 低レベルな設計には、より多くのエンジニアリング作業が必要
- リトライと外部への副作用には慎重な対応が必要
5. Google Genkit
Google Genkitは、AIアプリケーションやエージェントを構築するためのオープンソースフレームワークで、対応言語にはTypeScriptも含まれます。モデルの呼び出しやアプリケーションのツールを、開発・検査のワークフローと連携させます。ドキュメント抽出、アシスタント、コンテンツに基づく回答などの機能を、結果に至るまでの各ステップを把握しながら体系的に構築できる点が魅力です。
Googleが提供していますが、モデル連携はGoogleのモデルに限られません。そのため、単なるFirebaseやGeminiのラッパーとしてではなく、実際のアプリケーションのワークフローに基づいて比較する価値があります。まずは、入力と期待される出力が明確なフローから始め、出力が不完全または不正確な場合は、モデルの応答やツールの動作を確認しましょう。
プロバイダーとの連携やデプロイ方法によって、機能やコストは異なります。利用予定のモデル、ランタイム、監視環境の構成について、TypeScriptのドキュメントとプラグインの対応状況を確認してください。チームの作業スタイルにフロー指向の開発や検査ツールが合う場合は、Genkitをおすすめします。シンプルなプロバイダークライアントだけで機能全体を処理できる場合、Genkitの必要性は低くなります。また、アプリケーションコードで事実の正確性を評価し、ツールの権限を適切に制限する必要がなくなるわけではありません。
長所と短所
- 体系的なAIアプリケーション開発
- 複数のモデルプロバイダーに対応
- 実行状況を検査するツール
- プラグインの対応状況は確認が必要
- モデルの品質と権限管理は、引き続きアプリケーション側の責任
6. LlamaIndex TypeScript
AIアプリケーションにドキュメントや業務データから有用なコンテキストを与えることが中心的な課題であれば、LlamaIndex TypeScriptは有力な選択肢です。コネクター、インデックス作成・検索のコンポーネント、エージェント、ワークフローを提供します。大量のファイルをすべてのプロンプトにそのまま貼り付けるのではなく、データから回答に至るまでの一貫した経路を構築できることが特長です。
現行のフレームワークは、検索、生成、ツール呼び出しを組み合わせたイベント駆動型のワークフローにも対応しています。こうしたフレームワークの機能と、ドキュメントの解析や抽出などを提供するマネージドサービスのLlamaCloudは、区別して考えてください。オープンソースのパッケージに、ホスト型サービスの機能がすべて含まれているとは限りません。また、より広いエコシステムにあるPythonのサンプルが、同じようにTypeScriptと連携できるとも限りません。
最終的な回答を評価する前に、データパイプラインを確認しましょう。解析によって表や見出しが保持されるか、検索で適切な箇所が見つかるか、権限設定によって返されるコンテキストが制限されるかを確認してください。データソースの準備や検索がエンジニアリング作業の中心となる場合は、LlamaIndex TypeScriptをおすすめします。アプリケーションで主にAPI間のアクションを調整するのであれば、汎用エージェントフレームワークから始めるほうが適している場合があります。検索が単純なら、明示的なデータベースクエリで十分なこともあります。
長所と短所
- データ処理と検索に特化した構成要素
- 検索をエージェントやワークフローと組み合わせられる
- ナレッジアプリケーションに役立つ構成
- マネージドサービスは別製品
- TypeScriptとPythonでは連携範囲が異なる場合がある
7. Transformers.js
JavaScriptから対応済みの事前学習済みトランスフォーマーモデルを直接実行する場合、最初の選択肢としてTransformers.jsをおすすめします。パイプラインインターフェースでは、モデルの実行と、分類、埋め込み、音声認識などのタスクに必要な入力・出力処理をまとめて扱えます。これは上記のエージェントフレームワークとは役割が異なります。ホスト型サービスへの呼び出しを調整するだけでなく、アプリケーション内でモデルを実行します。
このライブラリはONNX Runtimeを使用し、対応している場合はWebAssemblyやWebGPUを使ったブラウザー実行にも対応します。ブラウザーで推論を行えばモデルへの入力を端末内にとどめられますが、それが可能かどうかはライブラリ名だけで決まるのではなく、アプリケーション全体のネットワーク動作によります。モデルファイルのダウンロードが必要な場合もあり、ファイルサイズ、メモリ使用量、初期化時間は初回利用時の使い勝手に影響します。
互換性を保証する前に、対象となるモデルのアーキテクチャ、エクスポート済みファイル、データ型、端末を確認してください。ドキュメントのmainブランチには未リリースのコードが記載されている場合があるため、インストールしたパッケージに対応するドキュメントを参照しましょう。前処理の手間を省けるタスク指向の推論には、Transformers.jsをおすすめします。ただし、Python版Transformersのすべてのチェックポイントをそのまま実行できる保証はありません。また、処理能力の低い端末では、より小さなモデルやサーバーへのフォールバックが必要になる場合があります。
長所と短所
- タスク指向の便利なパイプライン
- 複数のモダリティのモデルに対応
- ブラウザーとサーバーサイドのJavaScriptで推論可能
- モデルとランタイムの互換性を確認する必要がある
- ダウンロードとデバイスのメモリが使いやすさに影響する
8. ONNX Runtime Web
ONNX Runtime Webは、すでにONNXモデルを持ち、ブラウザーでの推論を直接制御したい開発者に適した、より低レベルの選択肢です。完全なエージェントやドキュメント処理のワークフローを提供するのではなく、セッション、テンソル、ランタイム設定を扱えます。これは候補リストにおける重要な空白を埋めるものです。言語モデルのオーケストレーションが関係しない場合でも、既存モデルのデプロイが主な課題となることがあります。
Transformers.jsと比べると、開発者は入力の準備や出力の解釈に、より多くの責任を負います。モデルチームがテンソルの形状や前処理をすでに定義している、カスタムの画像認識や分類のパイプラインでは、これが役立つことがあります。エクスポートしたグラフとその演算子が、選択した実行バックエンドで動作することを確認してください。ある環境で動作するモデルでも、すべてのブラウザーアクセラレーターとの互換性が保証されるわけではありません。
現在、スタートガイドではWebGPUとWebNNの統合経路は実験的とされています。そのため、デプロイに関する判断は、テスト対象となる正確なランタイムとブラウザーの組み合わせに基づいて行う必要があります。評価には、初期化、モデルのダウンロード、メモリ使用量、フォールバック時の動作を含めてください。既知のモデル成果物を制御したい場合は、ONNX Runtime Webを推奨します。より低レベルのアクセスよりも、既存の前処理やモデル対応によって作業を減らせる場合は、代わりにタスクレベルのライブラリを選びましょう。
メリットとデメリット
- ONNXモデルの実行を直接制御できる
- カスタムのエクスポート済みモデルに適している
- JavaScriptとTypeScriptのランタイムインターフェース
- モデルごとの前処理と出力処理が必要
- 高速化バックエンドには互換性の制約がある
9. TensorFlow.js
開発者が生成AIサービスに接続するのではなく、JavaScriptで機械学習モデルを構築、調整、実行する必要がある場合、TensorFlow.jsは今も有力な選択肢です。モデルの開発とトレーニング、事前学習済みモデルの利用、互換性のあるPython版TensorFlowモデルの変換に対応しています。そのため、ブラウザーやNode.js環境で動作する、対話型学習アプリケーションやカスタム予測タスクに適した、独自の選択肢となります。
トレーニング機能を備えていることは、主に事前学習済みモデルの推論に特化したツールキットとの大きな違いです。たとえば、小規模なアプリケーションで、既存の表現をユーザーが指定したカテゴリに合わせて調整できます。重要なのは、プロジェクトにエージェントフレームワークが必要かどうかではなく、その学習をJavaScript内、デバイス上、あるいは既存の製品内で行う必要があるかどうかです。
対象となるモデルと実行環境について、変換対応、バックエンドの動作、メモリ管理、依存関係の互換性を確認してください。ブラウザー上の軽量なサンプルが動作しても、大規模なモデルが一般的なユーザーのハードウェアで動くとは限りません。トレーニング機能とテンソルAPIを活用できるカスタム機械学習には、TensorFlow.jsを推奨します。対応する事前学習済みTransformerには、より直接的に扱えるTransformers.jsが適している場合があります。既知のONNX成果物には、ONNX Runtime Webという別のデプロイ方法があります。
メリットとデメリット
- 推論だけでなくトレーニングにも対応
- JavaScriptでモデルを開発するためのAPI
- ブラウザーとNode.jsのワークフローに対応
- モデル変換には互換性の制限がある
- ユーザーデバイス上でのリソース管理が重要
10. MediaPipe Tasks for Web
手のランドマーク、ポーズのランドマーク、物体検出、音声分類など、対応する知覚タスクがアプリケーションに必要な場合、MediaPipe Tasks for Webは実用的な選択肢です。そのタスクAPIでは、モデルと、入力の処理方法および結果の解釈方法が明確に定められています。カメラを使うインターフェースでは、汎用エージェントフレームワークを選び、知覚パイプラインを別途組み立てるよりも、はるかに直接的な方法となる場合があります。
重要な制約は、プラットフォームの対応範囲です。MediaPipe全体のカタログは複数のプラットフォームにまたがっていますが、掲載されているすべてのタスクがWebで利用できるわけではありません。そのタスクを前提に設計する前に、公式の対応状況一覧とWeb向けガイドで、該当タスクの対応状況を確認してください。モデルのカスタマイズが可能かどうかもタスクによって異なります。エコシステムにModel Makerが含まれていても、すべてのモデルをブラウザー内で直接再トレーニングできるわけではありません。
照明が弱い、背景に雑音があるといった状況や、ユーザーが実際に使用するハードウェアを含め、現実的なカメラまたは音声の条件で評価してください。推論処理によってインターフェースの応答性が損なわれないようにし、権限のリクエストがユーザーに分かりやすいものとなるようにしてください。対応する知覚機能の要件が明確な場合は、MediaPipeを推奨します。これは汎用的なLLMフレームワークではなく、特定分野に特化したツールキットです。順位が低いのは対象範囲がより限定的だからであり、想定されたタスクで性能が劣るためではありません。
メリットとデメリット
- 対応する知覚タスク向けの直接的なAPI
- 事前学習済みモデルによりセットアップの手間を削減
- デバイス上で動作するインタラクティブな体験に適している
- タスクによってウェブでの利用可否が異なる
- カスタマイズ性とデバイス上でのパフォーマンスを検証する必要がある
フレームワークを選ぶ前に、どのレイヤーが必要かを見極める
アプリケーションSDKは、モデルを製品の機能やインターフェースに接続します。エージェントフレームワークは、モデルの判断やツールを整理します。ワークフローランタイムは、状態や分岐、復旧を制御します。検索フレームワークは、関連するコンテキストを準備して提供します。推論ライブラリは、モデルを実行します。応答性の高いチャットインターフェースがあっても、再起動後にワークフローが継続できるとは限りません。また、モデルのダウンロードに成功しても、スマートフォン上で快適に動作するとは限りません。
LangChainとLangGraphは意図的に機能が重なっています。LangChainのエージェントは内部でLangGraphを使用しますが、LangGraphを直接使えば、より低いレイヤーで制御できます。Transformers.jsとONNX Runtime Webも関連するレイヤーに位置し、Transformers.jsはランタイムにモデルやタスクを扱うための利便性を加えています。こうした関係は、インフラを重複して構築するのではなく、各要素をどのように組み合わせるかを考える際の指針となります。
採用を決める前に検証すべきこと
- 実際の出力品質:代表的な入力と、正解がわかっている結果を使って検証します。構造化出力は実行時にも検証してください。TypeScriptの型だけでは、外部からの応答が正しいことは保証できません。
- 障害と復旧:タイムアウト、中断されたストリーム、利用できないツール、再起動をテストします。状態を保持するワークフローでは、再開時に重大な外部アクションが繰り返されないことを確認してください。
- プロバイダー間の移植性:想定する各モデルで同じタスクを繰り返し実行します。共通のAPIを使っているからといってプロバイダー間に違いがないと決めつけず、ツールの動作、構造化出力への対応、レイテンシ、コストを比較してください。
- ランタイムとの互換性:使用するNode.js、ブラウザー、またはエッジ環境と、その依存関係を正確に確認します。ネイティブパッケージ、モデルファイル、接続処理、長時間実行される処理によって、コードをデプロイできる環境が変わることがあります。
- ブラウザーでの使用感:代表的なデバイスで、初回のモデルダウンロード、初期化、メモリ使用量、応答性、フォールバック時の動作を測定します。プロバイダーの秘密情報はサーバー上で管理してください。推論をブラウザー内で実行するからといって、APIキーを公開してよいわけではありません。
- 運用状況の可視化:機密データがログに記録されるのを防ぎながら、モデル呼び出し、ツールの結果、障害、コストを追跡します。ツールの認可はアプリケーションコードで強制し、モデルへの指示とは切り分けてテストしてください。
依存関係のバージョンを固定し、インストール済みのバージョンに対応するドキュメントを読みましょう。特に、Transformers.jsのメインドキュメントにはソースからのビルド方法が記載されている場合がある一方、ONNX Runtime Webのガイドでは、一部の高速化手法が実験的機能とされています。デモをデプロイの保証とみなす前に、最新のリリース情報を確認してください。
データレイヤーについては、機械学習とAI向けデータベースの比較をご覧ください。モデルの選定については、オープンソースおよびオープンウェイトのLLMに関するガイドをご覧ください。こうした選択は、JavaScriptフレームワークとは独立して、検索と生成の品質に影響します。
JavaScriptまたはTypeScriptのAIフレームワークは、どれを選ぶべきか
インタラクティブなAI製品機能にはVercel AI SDK、柔軟に設定できるエージェントや連携機能にはLangChain.js、統合されたTypeScriptエージェント開発環境にはMastraを選びましょう。状態、分岐、復旧を明示的に管理することが中心的な要件なら、LangGraph.jsを直接使ったオーケストレーションに移行してください。
フローを中心とするアプリケーション開発にはGoogle Genkitを、ドキュメントと検索が作業の大部分を占める場合にはLlamaIndex TypeScriptを検討してください。JavaScriptで実行するモデルには、対応する事前学習済みタスク向けのTransformers.js、既知のONNXモデルを制御するためのONNX Runtime Web、独自の学習と推論向けのTensorFlow.js、または対応する認識タスク向けのMediaPipe Tasks for Webから着手しましょう。
優れたアーキテクチャでは、各コンポーネントが明確な役割を担います。繰り返し発生する作業を減らせる場合や、動作を把握しやすくなる場合は抽象化を加えましょう。一方、モデルに判断させる必要がない処理は、通常のアプリケーションロジックとして明示的に記述してください。












