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] にします。

この問題を解いてみる →

よくある誤解

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

まとめ

タプル型は要素数も型として扱われる(余分な要素はエラーになる)は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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