TypeScript タプル
1. 型定義された配列 (Typed Arrays)
タプル(Tuple)は、あらかじめ決められた長さ(要素数)と、各インデックスに対する型を持つ、型定義された配列です。
タプルが優れている点は、配列内の各要素を既知の型の値として扱えるようにすることです。
タプルを定義するには、配列内の各要素の型を指定します。
例:タプルの定義
// タプルを定義
let ourTuple: [number, boolean, string];
// 正しく初期化
ourTuple = [5, false, 'プログラミングの神がここにいた'];上記のように、number、boolean、string の順で定義されています。
では、これらを誤った順序で設定しようとするとどうなるでしょうか。
例:順序が異なる場合
// タプルを定義
let ourTuple: [number, boolean, string];
// 誤った順序で初期化(エラーがスローされます)
ourTuple = [false, 'プログラミングの神の勘違い', 5];たとえ boolean、string、number という必要な型が揃っていても、タプルにおいては順序(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;