TypeScript | 基礎文法:配列・タプル – 配列型の書き方

TypeScript
スポンサーリンク

配列型とは何かをまずイメージする

配列は「同じ種類の値を、順番付きで並べたもの」です。
TypeScriptでは、「この配列には何の型の要素が入るのか」を型として表現できます。

const numbers = [1, 2, 3];      // 数字の配列
const names = ["Taro", "Hanako"]; // 文字列の配列
TypeScript

ここまではJavaScriptと同じですが、TypeScriptでは「numbers は number の配列」「names は string の配列」と型レベルで扱えるようになります。
この「要素の型をはっきりさせる」のが配列型です。


配列型の基本の書き方(T[] 記法)

一番よく使う形:T[]

もっとも基本で、いちばんよく使うのが T[] という書き方です。
T の部分に要素の型を入れて、「T の配列」という意味になります。

let scores: number[] = [80, 90, 100];
let messages: string[] = ["hello", "bye"];
TypeScript

scores は「number の配列」、messages は「string の配列」です。
この宣言をした瞬間から、TypeScriptは次のようなチェックをしてくれます。

scores.push(120);   // OK(number)
scores.push("120"); // エラー(string は入れられない)

messages[0] = "hi";   // OK
messages[1] = 123;    // エラー
TypeScript

「この配列にはこの型しか入れない」という約束を、型として固定できるのがポイントです。

型推論と組み合わせた書き方

初期値がある場合は、型注釈を書かなくても推論されます。

const scores = [80, 90, 100];      // number[] と推論
const messages = ["hello", "bye"]; // string[] と推論
TypeScript

ただし、空配列から始めるときは注意が必要です。

const xs = []; // any[] になりがちで危険
TypeScript

空配列は中身から型を推論できないので、any[] になってしまうことがあります。
その場合は、きちんと型を書いておく方が安全です。

const xs: number[] = [];
TypeScript

Array<T> 記法との違いと使い分け

Array<T> という書き方もある

配列型は、T[] のほかに Array<T> という書き方もできます。

let scores: Array<number> = [80, 90, 100];
let messages: Array<string> = ["hello", "bye"];
TypeScript

意味は number[]string[] とまったく同じです。
Array<T> はジェネリクスの形をしているので、ジェネリック型の文脈ではこちらの方が自然なこともあります。

実務ではどちらを使うか

基本的には T[] の方が短くて読みやすいので、
number[], string[], User[] のように書くことが多いです。

一方で、ネストした型になるときは Array<Array<number>> のように書くこともありますが、
number[][] の方がスッキリすることが多いので、まずは T[] をメインで覚えておけば十分です。


配列型とユニオン型の組み合わせ

「この型のどれかの配列」を表現する

配列の要素が「複数の型のどれか」である場合は、ユニオン型と組み合わせます。

type Id = number | string;

let ids: Id[] = [1, 2, "3", "4"];
TypeScript

ここでは ids は「number または string の配列」です。
要素ごとに numberstring かは違ってもよくて、とにかく「Id 型の配列」ということだけが保証されます。

逆に、「配列そのものが number[] か string[] のどちらか」という意味にしたい場合は、括弧の位置が変わります。

let xs: number[] | string[];
TypeScript

これは「number の配列」か「string の配列」のどちらか、という意味です。
(number | string)[]number[] | string[] は意味が違うので、括弧の位置には少しだけ注意しておくといいです。


配列型でよくあるつまずきポイント

any[] に逃げない意識を持つ

空配列から始めて、あとからいろいろ push していると、気づかないうちに any[] になっていることがあります。

let items = [];
items.push(1);
items.push("hello");
// items は any[] になり、型チェックが効きにくくなる
TypeScript

こうなると、「何でも入る配列」になってしまい、TypeScriptの恩恵が薄れます。
「この配列には何を入れたいのか」が決まっているなら、最初に型を決めてしまう方が安全です。

let items: (number | string)[] = [];
TypeScript

配列とタプルの違いを意識する入口にする

配列型は「同じ型の要素が並ぶもの」を表現するのに向いています。
一方で、「1番目は string、2番目は number のように、位置ごとに型が違うもの」はタプル型で表現します。

let user: [string, number] = ["Taro", 20]; // タプル
let users: [string, number][] = [
  ["Taro", 20],
  ["Hanako", 18]
]; // タプルの配列
TypeScript

最初は「全部同じ型なら配列」「位置ごとに意味が違うならタプル」とざっくり分けて考えると、整理しやすくなります。


まとめの感覚:配列型は「要素の型をはっきりさせる道具」

配列型の本質は、「この配列には何が入るのか」を型として宣言することです。

number[] と書いた瞬間に、「この配列には number しか入れない」という約束ができる。
User[] と書いた瞬間に、「この配列は User だけを並べる場所」になる。

その約束を守らせるために、TypeScriptは push や代入のたびにチェックしてくれます。
「とりあえず配列」ではなく、「何の配列か」を意識して型を書く——そこから、型付きの配列の気持ちよさが一気に見えてきます。

タイトルとURLをコピーしました