💡

TypeScriptで空でない配列を型で表現する

2021/07/28に公開

「空でない配列を表現する型」は需要がありそうで、ググってヒットする日本語の記事が少なかった(和訳されたサイトはあったが純粋な日本語の記事はすぐに出てこなかった)ため、ひとつくらいすぐにヒットする日本語の記事があればと思い、記事にします。

いきなりですがコードは以下です。

type NonEmptyArray<T> = [T, ...T[]];
// コンパイルエラー
const numbers: NonEmptyArray<number> = [];

// これはコンパイルが通る
const numbers: NonEmptyArray<number> = [1];

注意点として以下のようにT[]型として宣言すると空でなくてもNonEmptyArray<T>型と認識できず、コンパイルエラーとなるので、以下のようにtype guardを使ってやる必要があります。

const needNonEmpty = (arr: NonEmptyArray<number>) => arr.length
const a: number[] = [1,2,3];
const b: NonEmptyArray<number> = [1,2,3];
const isNonEmptyArray = <T>(arr: T[]): arr is NonEmptyArray<T> => arr.length > 0;

// コンパイルエラー
needNonEmpty(a);

// これはコンパイルが通る
needNonEmpty(b);

// これはコンパイルが通る
if (isNonEmptyArray(a)) needNonEmpty(a);

Discussion