LoginSignup
4
0

More than 3 years have passed since last update.

【TypeScript】ユーザー定義型ガードと配列

Posted at

(前提)ユーザー定義型ガード

次のような型を定義した場合、

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"]

/以上

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0