type Priority = "low" | "medium" | "high";
// ただの string が Priority かどうかを検証する関所
function isPriority(value: string): value is Priority {
return value === "low" || value === "medium" || value === "high";
}
function applyPriority(rawValue: string): string {
if (isPriority(rawValue)) {
const accepted: Priority = rawValue; // 検証済みなので代入できる
return "優先度を " + accepted + " に設定しました";
}
return "不正な優先度です: " + rawValue;
}
console.log(applyPriority("high"));
console.log(applyPriority("urgent"));
5unknownなJSONデータの形を検証する
JSON.parse の結果のような中身が保証できない値は unknown で受け、型述語で形を確かめてから使うのが安全な作法です。オブジェクトであること、必要なプロパティがあること、その型が合っていることまで調べて初めて User として扱えます。APIレスポンスの入力検証ガードそのものです。
TypeScript
type User = { userName: string; age: number };
function isUser(value: unknown): value is User {
if (typeof value !== "object" || value === null) {
return false;
}
// プロパティの存在と、その値の型まで確かめる
return "userName" in value && typeof value.userName === "string" &&
"age" in value && typeof value.age === "number";
}
const goodData: unknown = JSON.parse('{"userName": "Taro", "age": 28}');
const badData: unknown = JSON.parse('{"userName": "Hanako"}');
if (isUser(goodData)) {
console.log(goodData.userName + "(" + goodData.age + "歳)");
}
console.log(isUser(badData)); // age がないので false