Code Fix

初級

Cannot assign to because it is a constant の原因と直し方

constで宣言した変数に再代入しようとしたときに出るエラーです。JavaScriptでは実行時のTypeErrorでしたが、TypeScriptは実行前のコンパイル段階でこれを検出します。

エラーメッセージの読み方

main.ts(2,1): error TS2588: Cannot assign to 'count' because it is a constant.
main.ts
ファイル名
2
行番号
1
列番号 — この位置でtscが検査に失敗しました
TS2588
エラーコード — 検索するとTypeScriptの解説が見つかります
Cannot assign to 'count' because it is a constant.
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  const count = 5;
 2  count     = 6;
        ^
 3  console.log(count);
main.ts(2,1): error TS2588: Cannot assign to 'count' because it is a constant.

countはconstで宣言されているため再代入できません。値を変えたい場合はletで宣言します。

直し方: count を let dummy にします。

この問題を解いてみる →

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

パターン2

 1  const MAX = 100;
 2  function raiseLimit() {
 3    MAX       = 200;
          ^
 4  }
 5  raiseLimit();
 6  console.log(MAX);
main.ts(3,3): error TS2588: Cannot assign to 'MAX' because it is a constant.

MAXはconstです。関数の中からであっても再代入は許されません。

直し方: MAX を let dummy にします。

この問題を解いてみる →

パターン3

 1  const name = "Al";
 2  name      = "Bob";
        ^
 3  console.log(name);
main.ts(2,1): error TS2588: Cannot assign to 'name' because it is a constant.

nameはconstで宣言した変数です。別の値を代入し直すことはできません。

直し方: name を let dummy にします。

この問題を解いてみる →

パターン4

 1  const total = 10;
 2  total     = 20;
        ^
 3  console.log(total);
main.ts(2,1): error TS2588: Cannot assign to 'total' because it is a constant.

totalはconstで宣言されているため再代入できません。

直し方: total を let dummy にします。

この問題を解いてみる →

パターン5

 1  const label = "X";
 2  label     = "Y";
        ^
 3  console.log(label);
main.ts(2,1): error TS2588: Cannot assign to 'label' because it is a constant.

labelはconstです。別の値を代入し直すことはできません。

直し方: label を let dummy にします。

この問題を解いてみる →

よくある誤解

JavaScriptの経験がある人は「これは実行時エラーのはず」と考えがちですが、TypeScriptでは同じ間違いがコンパイルエラーに格上げされます。実行する前に、tscを通した時点で気づけます。

実務での勘所

このチェックは、TypeScript独自の新しいルールというより、JavaScript自身がすでに持っているconstの制約(一度代入したら再代入できない)を、実行を待たずに前倒しで検出しているだけです。TypeScriptが型システムとして新たに追加したチェック(引数の型チェックなど)とは性質が違い、JavaScriptの言語仕様そのものをコンパイル時に先取りして教えてくれる、という関係になっています。

演習をはじめる

関連するエラー

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