TypeScript 速習チュートリアル

TypeScript タプル

1. 型定義された配列 (Typed Arrays)

タプル(Tuple)は、あらかじめ決められた長さ(要素数)と、各インデックスに対する型を持つ、型定義された配列です。

タプルが優れている点は、配列内の各要素を既知の型の値として扱えるようにすることです。

タプルを定義するには、配列内の各要素の型を指定します。

例:タプルの定義

// タプルを定義
let ourTuple: [number, boolean, string];

// 正しく初期化
ourTuple = [5, false, 'プログラミングの神がここにいた'];

上記のように、numberbooleanstring の順で定義されています。
では、これらを誤った順序で設定しようとするとどうなるでしょうか。

例:順序が異なる場合

// タプルを定義
let ourTuple: [number, boolean, string];

// 誤った順序で初期化(エラーがスローされます)
ourTuple = [false, 'プログラミングの神の勘違い', 5];

たとえ booleanstringnumber という必要な型が揃っていても、タプルにおいては順序(Order)が重要であるため、エラーが発生します。

2. 読み取り専用タプル (Readonly Tuple)

優れたプラクティスとして、タプルを readonly(読み取り専用) にすることが挙げられます。

通常のタプルでは、初期値に対してのみ強力な型定義が行われます。

例:型安全性の欠如

// タプルを定義
let ourTuple: [number, boolean, string];
// 正しく初期化
ourTuple = [5, false, 'プログラミングの神がここにいた'];
// タプルのインデックス 3以降に対しては型安全性がありません
ourTuple.push('新しく追加された、意図しない値');
console.log(ourTuple);

実行すると、新しく追加された値が確認できてしまいます。
初期値の型定義を厳密に維持するには、以下のように記述します。

例:readonly タプルの定義

// 読み取り専用タプルを定義
const ourReadonlyTuple: readonly [number, boolean, string] = [5, true, '真のプログラミングの神'];
// 読み取り専用のため、pushを実行しようとするとエラーが発生します
ourReadonlyTuple.push('プログラミングの神は休暇を取った');

readonly のようなアクセス修飾子(Access Modifiers)について詳しく知りたい場合は、こちらのセクションを参照してください:TypeScript クラス(Classes)

もし React を使用したことがあれば、おそらくタプルを扱ったことがあるはずです。
useState フックは、値とそのセッター関数のタプルを返します。

const [firstName, setFirstName] = useState('Dylan') はよくある例です。
この構造のおかげで、リストの最初の値は特定の型(この場合は string)、2番目の値は function であることが保証されます。

3. 名前付きタプル (Named Tuples)

名前付きタプル(Named Tuples)を使用すると、各インデックスの値にコンテキスト(意味)を持たせることができます。

例:Named Tuples

const graph: [x: number, y: number] = [55.2, 41.3];

名前付きタプルを使用することで、そのインデックスの値が何を表しているのか、より明確な情報を提供できます。

4. タプルの分割代入 (Destructuring Tuples)

タプルは実体として配列であるため、分割代入(Destructuring)を行うことができます。

例:タプルの分割代入

const graph: [number, number] = [55.2, 41.3];
const [x, y] = graph;