Code Fix

中級

タプル型は要素数も型として扱われる(余分な要素はエラーになる)

[number, number]のようなタプル型は、要素の型だけでなく要素数も型情報の一部です。通常のnumber[]と違い、決められた数より多い(または少ない)要素を持つ配列は代入できません。

エラーメッセージの読み方

main.ts(1,7): error TS2322: Type '[number, number, number]' is not assignable to type '[number, number]'.
main.ts
ファイル名
1
行番号
7
列番号 — この位置でtscが検査に失敗しました
TS2322
エラーコード — 検索するとTypeScriptの解説が見つかります
Type '[number, number, number]' is not assignable to type '[number, number]'.
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  const point: [number, number] = [1, 2, 3];
                                        ^
 2  console.log(point);
main.ts(1,7): error TS2322: Type '[number, number, number]' is not assignable to type '[number, number]'.

[number, number]は要素数2のタプルです。3個の要素を持つ配列は代入できません。

直し方: [1, 2, 3] を [1, 2] にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  const rgb: [number, number, number] = [255, 0]   ;
                                               ^
 2  console.log(rgb);
main.ts(1,7): error TS2322: Type '[number, number]' is not assignable to type '[number, number, number]'.

[number, number, number]は要素数3のタプルです。2個しか無い配列は代入できません。

直し方: [255, 0] を [255, 0, 0] にします。

この問題を解いてみる →

パターン3

 1  const entry: [string, number] = ["Al", 30, true];
                                            ^
 2  console.log(entry);
main.ts(1,7): error TS2322: Type '[string, number, boolean]' is not assignable to type '[string, number]'.

[string, number]というタプル型に3要素の配列は代入できません。要素数もタプル型の一部です。

直し方: ["Al", 30, true] を ["Al", 30] にします。

この問題を解いてみる →

パターン4

 1  const coord: [number, number, number] = [1, 2]   ;
                                                ^
 2  console.log(coord);
main.ts(1,7): error TS2322: Type '[number, number]' is not assignable to type '[number, number, number]'.

[number, number, number]は要素数3のタプルです。2個しか無い配列は代入できません。

直し方: [1, 2] を [1, 2, 3] にします。

この問題を解いてみる →

パターン5

 1  const pair2: [string, string] = ["a"]     ;
                                         ^
 2  console.log(pair2);
main.ts(1,7): error TS2322: Type '[string]' is not assignable to type '[string, string]'.

[string, string]は要素数2のタプルです。1個しか無い配列は代入できません。

直し方: ["a"] を ["a", "b"] にします。

この問題を解いてみる →

よくある誤解

「タプルもただの配列だから、要素数は自由なはず」という考えは誤りです。タプル型は固定長の構造として定義されており、要素数が違う時点で別の型として扱われます。

実務での勘所

JavaScriptの実行時にはタプルという概念自体が存在しません。[number, number]という型のタプルも、コンパイル後は普通の配列とまったく区別が付かないただのJavaScriptの配列になります。要素数のチェックはTypeScriptがコンパイル時にだけ行う、型システム上の約束事です。any型を経由するなどして型チェックをすり抜ければ、実行時にはタプルのつもりの配列へpush()で要素を追加することも技術的には可能です。「タプル」という安全性は、あくまでtscの検査を信頼して初めて成り立ちます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)