Promise<T> / async / awaitの型
| 対応: | Promise<T> | TypeScript 2.0(2016) |
|---|---|---|
| async/await | TypeScript 2.1(2016) |
TypeScript では非同期処理にも型注釈を付けられます。『Promise<T>』は解決値の型を指定し、『async』関数は自動的に戻り値が『Promise』に包まれます。『Awaited<T>』を使うと Promise を解決した後の型を取得できます。
構文
// Promise の型注釈
function fn(): Promise<T> { /* ... */ }
// async 関数(戻り値は自動で Promise<T> になる)
async function fn(): Promise<T> {
const result = await somePromise; // result: T
return result;
}
// Awaited で解決後の型を取得
type Resolved = Awaited<Promise<T>>; // => T
型一覧
| 型・構文 | 概要 |
|---|---|
| Promise<T> | 非同期処理の結果として T 型の値を解決する Promise を表す。 |
| async function | 戻り値が自動的に Promise<T> になる非同期関数。 |
| await | Promise を解決して値を取り出す。async 関数内で使用可。 |
| Awaited<T> | Promise<T> から T を取り出す型(再帰的に解決)。TypeScript 4.5+。 |
| Promise.all | 複数の Promise を並列実行し、全解決結果のタプルを返す。 |
サンプルコード
interface User {
id: number;
name: string;
}
// Promise<T> の明示的な型注釈
function fetchUser(id: number): Promise<User> {
return fetch(`/api/users/${id}`).then(res => res.json());
}
// async/await を使った書き方
async function getUser(id: number): Promise<User> {
const res = await fetch(`/api/users/${id}`);
const user: User = await res.json();
return user;
}
// エラーハンドリング
async function safeGetUser(id: number): Promise<User | null> {
try {
return await getUser(id);
} catch {
return null;
}
}
// Awaited を使った型の抽出
type UserResult = Awaited<ReturnType<typeof getUser>>;
// => User
// Promise.all の型推論
async function loadAll(): Promise<void> {
const [user1, user2] = await Promise.all([
getUser(1),
getUser(2),
]);
// user1, user2 はどちらも User 型
console.log(user1.name, user2.name);
}
概要
『async』関数の戻り値型は自動的に『Promise』で包まれます。たとえば戻り値型を『string』と書いても、実際の型は『Promise<string>』になります。そのため、型注釈として『async function fn(): Promise<string>』と明示するのが一般的です。
『Awaited<T>』はReturnType<T> と組み合わせることで、非同期関数の解決後の戻り値型を取得するのに役立ちます。
catch ブロックの引数は TypeScript 4.0 以降『unknown』型として扱われます。エラーオブジェクトのメッセージなどにアクセスするには、instanceof ガード で型を絞り込む必要があります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。