文字列と数値の+の左結合で意図しない連結になる
文字列と数値を+で連続してつなげると、最初の+で文字列に変換され、それ以降の+はすべて文字列連結として扱われます。型注釈でnumberと宣言していても、+演算子自体の挙動はJavaScriptと同じです。
なぜエラーが出ないのか
出力: 合計: 34
(エラーなし)- TypeScriptは何も報告しません。型検査も構文も正しいためです
出力: 合計: 34- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 const a: number = 3; 2 const b: number = 4; 3 console.log("合計: " + a + b ); ^
"合計: " + aで先に文字列になるため、続く+ bは文字列連結になります。数値として足したい場合は(a + b)のように括弧で先に計算します。
直し方: "合計: " + a + b を "合計: " + (a + b) にします。
パターン2
1 const price: number = 100; 2 const tax: number = 10; 3 console.log("税込: " + price + tax ); ^
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 ); ^
x + yは両方とも数値なので先に3として計算されますが、この式自体はすでに括弧を付けても付けなくても同じ3になります(左結合のため)。区別のため括弧を明示します。
直し方: x + y + "=" + z を (x + y) + "=" + z にします。
パターン4
1 const a: number = 5; 2 const b: number = 6; 3 console.log("和: " + a + b ); ^
"和: " + aで先に文字列になるため、続く+ bは文字列連結になります。
直し方: "和: " + a + b を "和: " + (a + b) にします。
パターン5
1 const w: number = 2; 2 const h: number = 8; 3 console.log("面積: " + w + h ); ^
wとhを先に数値として足したい場合は、括弧で明示的にまとめる必要があります。
直し方: "面積: " + w + h を "面積: " + (w + h) にします。
よくある誤解
「型を付けているのだから数値同士は先に計算されるはず」という考えは誤りです。numberという型注釈は代入できる値の種類を制限するだけで、+演算子の評価順序(左から順)までは変えません。
実務での勘所
+演算子そのものの挙動を型チェックが止めることはありませんが、その結果を別の場所で使おうとすると型の不一致として発覚することがあります。number型のつもりで書いた合計をtotal: string = a + bのような箇所で受けようとすると、+の結果が実際にはstring型になっているため、代入の時点で型エラーとして検出されます。演算そのものではなく、その結果を使う場所で間接的に守られることがある、という理解が実務では役立ちます。