(前提)ユーザー定義型ガード
次のような型を定義した場合、
interface Named {
name: string;
}
次のような関数を定義すると、
function isNamed(obj: any): obj is Named {
return typeof obj.name === "string";
}
次のように、あるオブジェクトが Named
型であるかどうか isNamed
関数を用いて判定し、true
であれば型アサーションなしで Named
型として扱うことができる。
const obj = JSON.parse('{ "name": "Alice" }');
if (isNamed(obj)) {
// ここでは obj が Named 型であるとみなされる。
console.log(`obj.name: ${obj.name}`);
} else {
console.log("`obj` is NOT Named.")
} // > "obj.name: Alice"
オブジェクトがユーザー定義型の配列であるかどうかを判定する
あるオブジェクトがユーザー定義型の配列であるかどうかを判定するには次のようにする。
const obj = JSON.parse('[{ "name": "Alice" }, { "name": "Bob" }, { "name": "Charlie" }]');
if (Array.isArray(obj) && obj.every(isNamed)) {
// ここでは obj が Named[] 型であるとみなされる。
console.log(obj.map(named => named.name));
} else {
console.log("`obj` is NOT array of Named.");
} // > ["Alice", "Bob", "Charlie"]
/以上