文字列と数値の+の左結合で意図しない連結になる
文字列と数値を+で連続してつなげると、最初の+で文字列に変換され、それ以降の+はすべて文字列連結として扱われます。型注釈でnumberと宣言していても、+演算子自体の挙動はJavaScriptと同じです。
なぜエラーが出ないのか
出力: 合計: 34
(エラーなし)- TypeScriptは何も報告しません。型検査も構文も正しいためです
出力: 合計: 34- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 const a: number = 3; 2 const b: number = 4; 3 console.log("合計: " + a + b ); ^
出力: 合計: 34
"合計: " + aで先に文字列になるため、続く+ bは文字列連結になります。数値として足したい場合は(a + b)のように括弧で先に計算します。
直し方: "合計: " + a + b を "合計: " + (a + b) にします。
広告
広告スロット(未設定)
パターン2
1 const price: number = 100; 2 const tax: number = 10; 3 console.log("税込: " + price + tax ); ^
出力: 税込: 10010
priceとtaxを先に数値として足したい場合は、括弧で明示的にまとめる必要があります。
直し方: "税込: " + price + tax を "税込: " + (price + tax) にします。
パターン3
1 const x: number = 1; 2 const y: number = 2; 3 const z: number = 3; 4 console.log(x + y + "=" + z ); ^
出力: 3=3
x + yは両方とも数値なので先に3として計算されますが、この式自体はすでに括弧を付けても付けなくても同じ3になります(左結合のため)。区別のため括弧を明示します。
直し方: x + y + "=" + z を (x + y) + "=" + z にします。
よくある誤解
「型を付けているのだから数値同士は先に計算されるはず」という考えは誤りです。numberという型注釈は代入できる値の種類を制限するだけで、+演算子の評価順序(左から順)までは変えません。
まとめ
文字列と数値の+の左結合で意図しない連結になるは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。