導入
状態を "loading" や "success" のような文字列で管理することはよくありますが、ただの string 型だと "laoding" のようなタイプミスに気づけません。決まった値だけを許すリテラル型を使うと、タイプミスをコンパイル時に防げます。あわせて、複数のオブジェクト型を合体させる交差型(&)も学びます。
説明
文字列や数値そのものを型として使えます。| でつなげば「決まった値のどれか」を表せます。
type Direction = "up" | "down" | "left" | "right";
function move(dir: Direction): void {
console.log("移動:", dir);
}
move("up");
// move("upward"); // エラー: Direction にない文字列は渡せない
&(交差型)は、複数の型をすべて満たす型を作ります。オブジェクト型同士を組み合わせるとプロパティが合成されます。
type Named = { name: string };
type Aged = { age: number };
type Person = Named & Aged; // { name: string; age: number } と同じ
const p: Person = { name: "太郎", age: 25 };
console.log(p.name, p.age);
interface の継承(extends)と似ていますが、type の交差型はユニオン型同士の合成など、より柔軟な組み合わせにも使えます。
やってみよう
Person から age を抜いたオブジェクトを p に代入しようとして、どんなエラーになるか確かめてみましょう(コメントアウトを外して試すか、頭の中で考えてみてください)。
演習
Status というリテラル型 "ok" | "ng" を作ってください。check という関数を作り、引数 status: Status を受け取って、"ok" なら "問題なし"、"ng" なら "エラー" を返すようにします。console.log(check("ok")) で結果を表示してください。
ヒント1を見る
type Status = "ok" | "ng"; と書きます。
ヒント2を見る
function check(status: Status): string { return status === "ok" ? "問題なし" : "エラー"; }