下のような型をもつ変数 obj
が提供されていて、
これが number
なのか number[]
なのかを区別したいとき。
type Value<T> = T | readonly T[] | undefined | null; declare const obj: Value<number>;
こういう文法が使えるのを必要がなかったので知らなかったのだけども、
下のような形で isArray
を定義してあげれば、良い感じに型が解決される。
const isArray = <T>(maybeArray: T | readonly T[]): maybeArray is T[] => { return Array.isArray(maybeArray); }; if (obj && isArray(obj)) { const array = obj; // array is number[] }
もちろん逆バージョン (T
かどうかを調べる) を定義すればそういうふうに使える
const isSingle = <T>(maybeArray: T | readonly T[]): maybeArray is T => { return !Array.isArray(maybeArray); }; if (obj && isSingle(obj)) { const single = obj; // single is number }
User-Defined Type Guards という機能だったらしい。
ということで、メモでした