TS初めてのTypeScript

Day 3ユニオン・絞り込み・ジェネリクス(読める範囲で)

ジェネリクスの読み方(Array<T>, Promise<T>)

Array<T> や Promise<T> の <T> が「中身の型を差し込む穴」であることを読めるようになる。

<T> は「中身の型を差し込む穴」

TypeScriptのコードを読むと Array<string> や Promise<User> のように、山かっこ <> の付いた型をよく見ます。この <> の中身は「後から差し込む型」を表し、この仕組みをジェネリクスと呼びます。まずは書く側ではなく、読める側になることを目標にします。

Array<T> は「T という型の値が並んだ配列」を意味します。T の部分に実際の型を入れると、中身が何の配列かが決まります。string[] という書き方は Array<string> と同じ意味です。

TYPESCRIPT
// どちらも「文字列の配列」を表す。同じ意味
let names1: Array<string> = ["a", "b"];
let names2: string[] = ["a", "b"];

// 数値の配列
let scores: Array<number> = [80, 95];

// ユーザーの配列(User は自分で定義した型のイメージ)
// let users: Array<User> = [...];
Array<T> の T に入れた型が、配列の中身の型になる

非同期処理でよく出るのが Promise<T> です。Promise は「今すぐには結果が無いが、あとで T 型の値が得られる約束」を表します。await を付けると、その中身の T が取り出せます。 と一緒に必ず登場します。

TYPESCRIPT
// getUser は「あとで User が得られる約束」を返す
async function getUser(): Promise<User> {
  const res = await fetch("/api/user");
  return res.json();
}

// await すると Promise<User> の中身 User が取り出される
const user: User = await getUser();

type User = { id: number; name: string };
Promise<User> は「あとで User が得られる」型。await で中身を取り出す

なぜ <T> の読み方が大事か

AIが生成した非同期コードの返り値は、ほぼ必ず Promise<何か> の形をしています。この <何か> を読めれば、await した後に何が手に入るのかが分かり、その先の処理が正しいか自分で判断できます。実装はAIに任せても、型を読めれば説明できます。

  1. Array<T> は「T が並んだ配列」。string[] と Array<string> は同じ
  2. Promise<T> は「あとで T が得られる約束」。await で中身の T を取り出す
  3. <> の中身は「差し込まれた型」だと読む。まずは読めれば十分

中身を読み違える

Promise<User[]> を User だと思って1件用に処理する

TYPESCRIPT
const users = await getUsers(); // Promise<User[]>
console.log(users.name); // エラー: 配列に name は無い

中身を正しく読む

User[] だと分かれば配列として扱える

TYPESCRIPT
const users = await getUsers(); // User[]
console.log(users[0].name); // OK

AIにはこう聞く

型が読めないときは「この関数の返り値 Promise<User[]> って、await した後は何になるの?」と聞けば、User の配列だと説明してくれます。<> の中身が分からないときの最短の確認方法です。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

Array<number> と同じ意味の書き方はどれ?

Q2

async function f(): Promise<string> の返り値を await したとき、得られる値の型はどれ?

Q3

Promise<User[]> という型を、日本語で噛み砕いて説明してください。await した後に何が得られるかも含めてください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。