なぜ今さら `alwaysStrict` なのか?――「なんとなく」でTypeScriptを書いている君へ
現場でコードレビューをしていると、未だに「`tsconfig.json` の設定はテンプレをそのまま使っている」というエンジニアによく出会う。特に今回取り上げる `alwaysStrict` は、設定ファイルの中で一番地味かもしれない。しかし、このオプションの有無は、君が書いたコードの「実行時の挙動」と「堅牢性」に致命的な差を生む。
今日は、なぜこの設定が現代のフロントエンド開発において「必須」なのか、ブラウザの裏側の挙動を交えながら深掘りしていこう。
—
1. `alwaysStrict` とは何か?
一言で言えば、「コンパイル後のすべてのJavaScriptファイルに `’use strict’;` を強制的に付与する」というオプションだ。
TypeScriptの仕事は「型チェックをして消える」ことだが、その際に生成されるJSが、現代のブラウザ環境においてどれだけ「行儀良く」振る舞えるかをコントロールするのがこのフラグの役割だ。
ブラウザの裏側で何が起きているのか?
ブラウザのJavaScriptエンジン(V8など)は、`’use strict’;` を検知するとモードを切り替える。このモード下では、以下のような「野放図なコード」がエラーとして弾かれるようになる。
- 暗黙のグローバル変数の生成禁止: `foo = 10` のように `var/let/const` を忘れると、即座に例外を投げる。
- `this` の挙動の修正: 非厳格モードでは `this` が `window`(あるいは `global`)を指していたが、厳格モードでは `undefined` になる。
- 削除不可プロパティの削除禁止: `delete Object.prototype` のような破壊的な操作を未然に防ぐ。
これらはすべて、バグの温床だ。TypeScriptで型安全を担保していても、コンパイル後のJSが非厳格モードで動いていたら、ランタイムで予期せぬ挙動を引き起こすリスクがある。それを防ぐのが `alwaysStrict` の真意だ。
—
2. 実務で遭遇する「事故」の再現
まずは、`alwaysStrict: false`(あるいは設定なし)の状態で何が起きるか見てみよう。
// strictモードが有効でない場合、以下のようなコードがコンパイルを通過してしまう可能性がある
function setConfig(value: number) {
// 開発者が意図せず global変数を作ってしまうバグ
// 厳格モードなら ReferenceError になるはずが、非厳格モードだと window.config が生成される
config = value;
}
// 厳格モードであれば、以下のような this の誤用もコンパイルエラーやランタイムエラーで即座に検知できる
function Logger() {
console.log(this); // 非厳格モードだと window オブジェクトが見えてしまう
}
現代のフロントエンド開発において、`window` への意図しない汚染は、サードパーティライブラリとの衝突や、デバッグ不可能な状態異常のトリガーになる。これを回避するための「防壁」が、`alwaysStrict` なんだ。
—
3. 実践:最強の `tsconfig.json` 設定
現場レベルのプロジェクトであれば、迷わず以下のように設定してほしい。`alwaysStrict` は `strict: true` に含まれているが、念のため明示することをおすすめする。
{
“compilerOptions”: {
/
実務レベルの推奨設定
strict: true をオンにすると、alwaysStrict も自動的に有効になります。
/
“strict”: true,
“alwaysStrict”: true,
/
その他、安全性を高めるための必須オプション
/
“noImplicitAny”: true, // ‘any’ 型を暗黙的に許可しない
“strictNullChecks”: true, // null や undefined の扱いを厳格に
“esModuleInterop”: true // CommonJS と ES Modules の相互運用を安全に
}
}
—
4. なぜ「型」だけでは不十分なのか?
中級者によくある誤解が、「TypeScriptの型チェックさえ通れば、ランタイムは安全だ」というものだ。しかし、TypeScriptは型システムであり、JSの実行時挙動(ES規格)をすべて補完するわけではない。
- 型は開発時の規約: 開発者が「ここはstringである」と宣言するもの。
- 厳格モードは実行時の規約: ブラウザが「ここは安全なコードである」と保証するもの。
この二つを掛け合わせることで、初めて「型安全」と「実行時安全」の両輪が揃う。もし君のプロジェクトで `alwaysStrict` が無効になっているなら、それはブレーキのない車で高速道路を走っているようなものだ。
—
結び:エンジニアとしての矜持
「とりあえず動く」コードを書くのは新人でもできる。だが、「なぜその設定が必要なのか」を理解し、ランタイムの挙動まで予測してコードを書くのが、我々プロフェッショナルの仕事だ。
`alwaysStrict` を有効にすることは、君のコードが汚染されるのを防ぐだけではない。チーム全体に対して「我々はモダンでクリーンな環境で開発している」という規律を示すことになる。
明日から君のプロジェクトの `tsconfig.json` を開いてみてくれ。もし `alwaysStrict` が設定されていなければ、それが君のチームを次のレベルへ押し上げるチャンスだ。
さあ、型定義の先にある、堅牢なランタイムの世界へようこそ。

コメント