switchと変数スコープ
JavaScriptでは、switch
ごとに変数スコープが作られます。
ts
switch (true // 変数スコープその1) {default:switch (true // 変数スコープその2) {default:// ...}}
ts
switch (true // 変数スコープその1) {default:switch (true // 変数スコープその2) {default:// ...}}
caseの変数スコープはない
case
ごとには変数スコープが作られません。複数のcase
がある場合、switch
全体で変数スコープを共有します。そのため、複数のcase
で同じ変数名を宣言すると実行時エラーが発生します。
ts
letx = 1;switch (x ) {case 1:constsameName = "A";break;case 2:constsameName = "B";break;}
ts
letx = 1;switch (x ) {case 1:constsameName = "A";break;case 2:constsameName = "B";break;}
TypeScriptでは、同じ変数名を宣言するとコンパイルエラーを出します。
ts
letx = 1;switch (x ) {case 1:constCannot redeclare block-scoped variable 'sameName'.2451Cannot redeclare block-scoped variable 'sameName'.= "A"; sameName break;case 2:constCannot redeclare block-scoped variable 'sameName'.2451Cannot redeclare block-scoped variable 'sameName'.= "B"; sameName break;}
ts
letx = 1;switch (x ) {case 1:constCannot redeclare block-scoped variable 'sameName'.2451Cannot redeclare block-scoped variable 'sameName'.= "A"; sameName break;case 2:constCannot redeclare block-scoped variable 'sameName'.2451Cannot redeclare block-scoped variable 'sameName'.= "B"; sameName break;}
caseに変数スコープを作る方法
caseに変数スコープを作るには、中カッコでcase節を囲みます。
ts
letx = 1;switch (x ) {case 1: {constsameName = "A";break;}case 2: {constsameName = "B";break;}}
ts
letx = 1;switch (x ) {case 1: {constsameName = "A";break;}case 2: {constsameName = "B";break;}}
こうすると、JavaScriptの実行時エラーも、TypeScriptのコンパイルエラーも発生しなくなります。
学びをシェアする
🌏JavaScriptのswitchは全体で1つの変数スコープ
😕caseレベルのスコープはない
もしも複数のcaseで同じ変数名を宣言すると…
🔥JavaScript → 実行時エラー
⛔️TypeScript → コンパイルエラー
✅caseに{}を書くと固有のスコープが作れる
『サバイバルTypeScript』より