タプル型は要素数も型として扱われる(余分な要素はエラーになる)
[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] にします。
よくある誤解
「タプルもただの配列だから、要素数は自由なはず」という考えは誤りです。タプル型は固定長の構造として定義されており、要素数が違う時点で別の型として扱われます。
まとめ
タプル型は要素数も型として扱われる(余分な要素はエラーになる)は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。