【実務・中級編】 tsconfigのalwaysStrictオプション – TypeScript実践ガイド

なぜ今さら `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` が設定されていなければ、それが君のチームを次のレベルへ押し上げるチャンスだ。

さあ、型定義の先にある、堅牢なランタイムの世界へようこそ。

コメント

タイトルとURLをコピーしました