TypeScriptでfetchを使う方法
TypeScriptにおけるfetchの使用は、ブラウザのFetch APIを利用して非同期リクエストを行うための基本的な手法です。
基本的な使い方
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
// レスポンスデータの処理
console.log(data);
})
.catch(error => {
// エラー処理
console.error(error);
});
- **.catch()**メソッド: エラーが発生した場合に実行されるコールバック関数を受け取ります。
- **.json()**メソッド: レスポンスのJSONデータをパースします。
- **fetch()**関数: 指定されたURLに対してHTTPリクエストを送信します。
型の指定
TypeScriptでは、型を指定することでコードの安全性と読みやすさを向上させることができます。
interface MyData {
name: string;
age: number;
}
fetch('https://api.example.com/data')
.then(response => response.json() as Promise<MyData>)
.then(data => {
// dataはMyData型なので、プロパティにアクセスできます
console.log(data.name, data.age);
})
.catch(error => {
console.error(error);
});
- as Promise<MyData>: レスポンスのJSONデータをMyData型に変換します。
- interface MyData: レスポンスデータの型を定義します。
非同期/待機 (async/await)
async/await構文を使うことで、非同期処理をより同期的なスタイルで書くことができます。
async function fetchData(): Promise<MyData> {
const response = await fetch('https://api.example.com/data');
const data = await response.json() as MyData;
return data;
}
fetchData().then(data => {
console.log(data);
}).catch(error => {
console.error(error);
});
- awaitキーワード: 非同期処理を待機します。
- asyncキーワード: 関数を非同期関数にします。
カスタムヘッダーやオプション
**fetch()**関数には、リクエストのカスタマイズのためのオプションを指定することができます。
``typescript const options: RequestInit = { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_token' }, body: JSON.stringify({ message: 'Hello!' }) };
fetch('[invalid URL removed]', options) .then(response => response.json()) .then(data => { console.log(data); }) .catch(error => { console.error(error); });
- **RequestInit**: リクエストのオプションを定義するインターフェースです。
- **method**: HTTPメソッドを指定します。
- **headers**: リクエストヘッダーを指定します。
- **body**: リクエストボディを指定します。
これらの方法を組み合わせて、さまざまなHTTPリクエストを実現することができます。
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
// レスポンスデータの処理
console.log(data);
})
.catch(error => {
// エラー処理
console.error(error);
});
- .catch(error => { ... }): レスポンスが失敗した場合、エラー情報が
error
変数に格納され、エラー処理を行います。 - .then(data => { ... }): JSONデータのパースが成功した場合、
data
変数にパースされたデータを格納し、その後の処理を行います。 - .then(response => response.json()): レスポンスが成功した場合、
response.json()
メソッドを使用してレスポンスのJSONデータをパースします。
interface MyData {
name: string;
age: number;
}
fetch('https://api.example.com/data')
.then(response => response.json() as Promise<MyData>)
.then(data => {
// dataはMyData型なので、プロパティにアクセスできます
console.log(data.name, data.age);
})
.catch(error => {
console.error(error);
});
- data.name, data.age:
data
変数がMyData
型なので、name
とage
プロパティにアクセスできます。 - .then(response => response.json() as Promise<MyData>): レスポンスのJSONデータを
MyData
型に変換します。
async function fetchData(): Promise<MyData> {
const response = await fetch('https://api.example.com/data');
const data = await response.json() as MyData;
return data;
}
fetchData().then(data => {
console.log(data);
}).catch(error => {
console.error(error);
});
- return data:
data
を返します。 - await response.json() as MyData:
response.json()
の呼び出しを待機し、JSONデータをMyData
型に変換してdata
変数に格納します。 - async function fetchData(): 非同期関数
fetchData
を定義します。
const options: RequestInit = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_token'
},
body: JSON.stringify({ message: 'Hello!' })
};
fetch('[invalid URL removed]', options)
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
- fetch('[invalid URL removed]', options): 指定されたURLに対して、オプションを指定してHTTPリクエストを送信します。
- body: リクエストボディを指定します。
- headers: リクエストヘッダーを指定します。
- method: HTTPメソッドを指定します。
- const options: RequestInit: リクエストのオプションを定義します。
Axios
Axiosは、HTTPリクエストを簡素化するためのライブラリです。TypeScriptとの互換性があり、より直感的なAPIを提供します。
import axios from 'axios';
axios.get('https://api.example.com/data')
.then(response => {
const data = response.data;
console.log(data);
})
.catch(error => {
console.error(error);
});
- response.data: レスポンスデータを取得します。
- axios.get(): GETリクエストを送信します。
Superagent
Superagentは、HTTPリクエストを柔軟にカスタマイズできるライブラリです。TypeScriptとの互換性があり、さまざまなHTTPメソッドやオプションをサポートします。
import superagent from 'superagent';
superagent
.get('https://api.example.com/data')
.end((err, res) => {
if (err) {
console.error(err);
} else {
const data = res.body;
console.log(data);
}
});
- .end(): リクエストを実行します。
Cross-fetch
Cross-fetchは、Node.js環境でfetch APIを提供するライブラリです。ブラウザ環境とNode.js環境で共通のAPIを使用することができます。
import fetch from 'cross-fetch';
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
- fetch(): fetch APIを使用します。
- import fetch from 'cross-fetch': Cross-fetchをインポートします。
カスタムライブラリ
独自のHTTPリクエストライブラリを作成することも可能です。これにより、特定のニーズに合わせてカスタマイズすることができます。
選択基準
これらの代替手法を選択する際には、以下の点を考慮してください。
- 必要な機能: 特定の機能が必要な場合は、それに対応するライブラリを選択してください。
- チームの好みと経験: チームメンバーが慣れているライブラリを使用することで、開発効率が向上します。
- プロジェクトの規模と複雑さ: 小規模なプロジェクトでは、fetch APIまたはAxiosが適しているかもしれません。大規模なプロジェクトでは、Superagentやカスタムライブラリが柔軟性とカスタマイズ性を提供します。
typescript promise fetch-api