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