初級のTypeScriptエラー 42問
14種類のエラーを、それぞれ複数パターンずつ収録しています。
- is not assignable to type の原因と直し方変数への代入・関数の戻り値・プロパティへの代入など、宣言した型と違う型の値を渡そうとしたときにtscが検出するエラーです。TypeScriptで最初に出会うエラーの1つです。
- implicitly has an 'any' type の原因と直し方関数のパラメータに型注釈を付けないと、strictモードのTypeScriptは型を推論できず「暗黙のany」としてエラーにします。anyは型チェックを無効化してしまうため、TypeScriptの利点を守るために既定で禁止されています。
- Cannot find name の原因と直し方宣言されていない変数・関数名を参照したときに出るエラーです。TypeScriptは近い名前が見つかると「Did you mean 'x'?」という候補も一緒に表示してくれます。
- Expected N arguments, but got M の原因と直し方関数に定義されているパラメータの数と違う数の引数を渡して呼び出したときに出るエラーです。JavaScriptでは引数が多すぎても少なすぎても実行できてしまいますが、TypeScriptは呼び出し時点で検出します。
- 引数の型が合わないエラーの原因と直し方関数やメソッドの引数に、パラメータの型と違う型の値を渡したときに出るエラーです。配列のpush()のような組み込みメソッドの引数でも同じ形式のエラーになります。
- 必須プロパティの書き忘れエラーの原因と直し方interfaceで定義した必須プロパティを、オブジェクトリテラルで指定し忘れたときに出るエラーです。1つでも足りないプロパティがあれば、その型の値として代入できません。
- 未定義プロパティを書いたエラーの原因と直し方interfaceに定義されていないプロパティを、オブジェクトリテラルに書いてしまったときに出るエラーです。プロパティ名のタイプミスもこの形で検出されます。
- Property does not exist on type の原因と直し方型に定義されていないプロパティ名でアクセスしようとしたときに出るエラーです。プロパティ名のタイプミスが典型的な原因で、近い名前があれば候補も表示されます。
- Cannot assign to because it is a constant の原因と直し方constで宣言した変数に再代入しようとしたときに出るエラーです。JavaScriptでは実行時のTypeErrorでしたが、TypeScriptは実行前のコンパイル段階でこれを検出します。
- 非nullアサーション(!)がコンパイラを騙して実行時エラーになる変数名の後ろに!を付ける非nullアサーションは、「この値はnull/undefinedではない」とコンパイラに約束する構文です。実際にはundefinedだった場合、型チェックは通過しますが実行時に例外が発生します。
- 配列の範囲外アクセスがエラーにならずundefinedになる(TypeScriptでも変わらない)TypeScriptは配列の要素数を型では追跡しないため、number[]のような型でも範囲外アクセスはコンパイルエラーになりません。実行時もJavaScriptと同じく、静かにundefinedを返します。
- 文字列メソッドは元の文字列を変更せず新しい文字列を返すtoUpperCase()のような文字列メソッドは、呼び出し元の文字列そのものを書き換えるのではなく、変換後の新しい文字列を戻り値として返します。戻り値を使わずに呼び出しただけでは何も変わりません。
- Array.prototype.sort()が数値を文字列として並べ替える理由比較関数を渡さないsort()は、number[]という型が付いていても要素を文字列に変換してUnicodeコードポイント順に並べ替えます。数値の大小とは無関係な結果になります。
- 文字列と数値の+の左結合で意図しない連結になる文字列と数値を+で連続してつなげると、最初の+で文字列に変換され、それ以降の+はすべて文字列連結として扱われます。型注釈でnumberと宣言していても、+演算子自体の挙動はJavaScriptと同じです。