なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

TypeScript で配列かどうかを型付きで判別したい

下のような型をもつ変数 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 という機能だったらしい。
ということで、メモでした