TypeScript でフェッチする
fetch
は、HTTP 接続を介してリソースを取得できる、グローバルに利用可能なネイティブ ブラウザー関数です。 TypeScript では、fetch
関数を使用して、型指定された応答データを消費できます。
TypeScript の fetch()
メソッド
Web API は、Window
と WorkerGlobalScope
を介してグローバルな fetch
メソッドを提供します。 これら 2つのインターフェイスは、fetch
メソッドが定義されている WindowOrWorkerGlobalScope
を実装します。
したがって、fetch
メソッドは、ネットワーク経由でリソースを取得するためのネイティブ ブラウザ機能として識別できます。 通常、fetch
メソッドは promise を返します。
したがって、HTTP 応答を処理するには then
ハンドラーを使用する必要があります。 fetch
メソッドの応答は、古い Jquery.ajax()
とは異なります。
promise はネットワーク障害または許可の問題によってのみ拒否されるため、404
や 500
などの HTTP エラーは拒否されません。
fetch
メソッドの構文を次に示します。
fetch(resource, [,custom_settings_per_request]);
resource
- ネットワークから取得するリソースです。 文字列でなければなりません。 基本的に、リソースの URL。custom_settings_per_request
- これはオプションのパラメーターです。 HTTP メソッド、ヘッダー、本文など、特定の HTTP リクエストのカスタム設定を渡すことができます。
ToDo
オブジェクトの配列を取得するダミーの HTTP エンドポイントを使用してみましょう。 以下は、fetch
呼び出しを行う方法を示しています。
fetch("https://jsonplaceholder.typicode.com/todos");
このリクエストは、Response
オブジェクトに解決されるレスポンスを返します。 したがって、then
ハンドラを使用してデータを取得する必要があります。
json()
メソッドで、レスポンスボディを操作してみましょう。
fetch("https://jsonplaceholder.typicode.com/todos")
.then(
(response) => response.json()
);
これにより、レスポンス本文データを含む別の Promise が返されます。 したがって、以下に示すように、別の then
ハンドラを使用して実際のデータにアクセスできます。
fetch("https://jsonplaceholder.typicode.com/todos")
.then(
(response) => response.json()
)
.then(
(toDoListArray) => console.log(toDoListArray)
);
出力:
TypeScript の厳密に型指定されたフェッチ レスポンス
fetch()
の欠点は、汎用関数ではないことと、型指定された応答データを使用するのが難しいことです。 したがって、TypeScript でラッパーを使用するとよいでしょう。
同じダミー HTTP エンドポイントを使用して、1つの ToDo
アイテムをフェッチしてみましょう。 返される response
オブジェクトは次のようになります。
{
"userId": 1,
"id": 2,
"title": "quis ut nam facilis et officia qui",
"completed": false
}
取得した response
オブジェクトを処理する Todo
型を作成しましょう。
// Todo type interface
interface Todo {
userId: number;
id: number;
title: string;
completed: boolean;
}
ジェネリック型の応答で fetch
メソッドを処理する新しい関数を作成します。
function fetchToDo<T>(resourceUrl: string): Promise<T> {
return fetch(resourceUrl).then(response => {
// fetching the reponse body data
return response.json<T>()
})
}
この関数は、データを消費するために呼び出すことができ、応答として型指定された Todo
オブジェクトを取得しています。 Todo
型変数に直接代入できます。
// Consuming the fetchToDo to retrieve a Todo
fetchToDo<Todo>("https://jsonplaceholder.typicode.com/todos/2")
.then((toDoItem) => {
// assigning the response data `toDoItem` directly to `myNewToDo` variable which is
// of Todo type
let myNewToDo:Todo = toDoItem;
// It is possible to access Todo object attributes easily
console.log('\n id: '+ myNewToDo.id + '\n title: ' + myNewToDo.title + '\n completed: ' + myNewToDo.completed + '\n User Id: ' + myNewToDo.userId);
});
出力:
"id: 2
title: quis ut nam facilis et officia qui
completed: false
User Id: 1"
この方法論は、POST
、DELETE
などの任意の HTTP メソッドに使用できます。
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.