【入門編】 tsconfig.jsonのstrictモード詳細 – TypeScript実践ガイド

こんにちは!TypeScriptの世界へようこそ。チーフアーキテクトの私です。

今日お話しするのは、TypeScriptを使う上で避けて通れない、いや、むしろ仲良くなると最強の味方になってくれる「`strict: true`(厳格モード)」についてです。

「TypeScriptを導入したはいいけれど、赤い波線(エラー)がいっぱい出てきて心が折れそう……」
「`any`って書いておけばとりあえず動くのに、なんで怒られるの?」

そんな風に悩んでいませんか? 大丈夫ですよ、安心してください。最初はその厳しさに戸惑うのが当たり前です。この記事では、なぜTypeScriptがそんなに厳しくチェックしてくるのか、その裏側にある優しさと仕組みを、身近な例えを交えながら一緒に紐解いていきましょう。

—

そもそも `tsconfig.json` の `strict` ってなに?

TypeScriptのプロジェクトを作ると、根っこ(ルートディレクトリ)に `tsconfig.json` という設定ファイルが自動で生成されます。その中に、こんな設定項目を見たことはありませんか?

{
“compilerOptions”: {
“strict”: true
}
}

この `strict: true` は、いわば「我が家の厳格なセキュリティ&お片付けルール一括パック」です。

これを `true` に設定すると、TypeScriptのコンパイラ(翻訳してチェックしてくれるお兄さん)が、コードのあやふやな部分を見逃さず、ピシッと指摘してくれるようになります。

「なんでそんなに厳しくするの?」って思いますよね。理由はシンプルで、「プログラムが動き出してから(本番環境で)バグって泣かないため」です。事前に危ない芽をすべて摘み取っておくための、先回りした優しさなんですよ。

—

`strict: true` の中身を覗いてみよう!

実は `strict: true` という設定は、いくつかの個別の厳格ルールをまとめた「セット商品」です。今回は、その中でも特に初心者がつまずきやすく、かつ重要な3つの代表選手をピックアップしてご紹介します。

1. `noImplicitAny` (「勝手に `any` にしちゃダメ!」)
2. `strictNullChecks` (「`null` や `undefined` の存在を無視しちゃダメ!」)
3. `strictFunctionTypes` (「関数の代入ルールを厳しく守ってね!」)

ひとつずつ、分かりやすい例えで見ていきましょう。

—

1. `noImplicitAny` :「勝手に `any`(なんでもいいよ)にしないで!」

例え話:仕分けルールのない「何でもボックス」

職場や学校に「とりあえず何でも入れていいよ」っていうダンボール箱があったとします。一見便利ですが、後から中身を取り出そうとしたとき、「あれ、これハサミだっけ? 飲みかけのジュースだっけ?」と中身が分からなくて困った経験はありませんか?

プログラムの世界でも同じです。型を指定し忘れたときに、TypeScriptが「めんどくさいから、何が入るか分からないけど `any`(何でもOK)にしておこうっと」と勝手に判断してしまう状態を 暗黙の `any`(Implicit Any) と呼びます。

`noImplicitAny` は、「勝手に『何でもボックス』にしないで! 中身が何か、ちゃんと最初に宣言しなさい!」と怒ってくれる機能です。

コードで見てみよう

// ❌ 【エラーになる書き方】
// 引数の x に型が書いていないため、TypeScriptが困ってしまいます
function double(x) {
return x 2; // 「xって数値? 文字列? 計算できるの?」と怒られます
}

// ⭕️ 【正しい書き方】
// 「x は数値(number)だよ」とちゃんと教えてあげます
function double(x: number): number {
return x 2; // これなら安心!
}

「型を書くのめんどくさいな」って最初は思うかもしれませんが、型を書いておくと、後からエディタが自動補完(「この後につけられるメソッドはこれだよ」と教えてくれる機能)で強力にサポートしてくれます。結果的にコードを書くスピードが爆発的に上がるので、絶対に味方につけたほうが得をしますよ!

—

2. `strictNullChecks` :「`null` や `undefined` の存在を無視しちゃダメ!」

例え話:中身が空っぽのプレゼントボックス

友達から「プレゼントを持ってきたよ!」と言われてウキウキで箱を開けたら、中身がからっぽ(`null`)だったり、箱すらなかった(`undefined`)とき、どう思いますか? 「えっ、ないなら最初からそう言ってよ!」ってなりますよね。

JavaScriptでは、データが存在しないことを表すために `null` や `undefined` がよく使われます。しかし、これらをうっかり忘れて「箱の中身はあるもの」として処理を進めると、プログラムがいきなりクラッシュ(フリーズ)してしまいます。

`strictNullChecks` は、「『この箱、空っぽかもしれないよ?』っていう可能性をちゃんと考慮してコードを書きなさい!」というお説教です。

コードで見てみよう

// ⭕️ 【正しい書き方(strictNullChecksが有効な世界)】
// 名前の文字列を受け取る関数ですが、もしかしたらデータがない(nullかも)と仮定します
function printUser(name: string | null) {
// いきなり .toUpperCase() を呼ぶと、「もし name が null だったらエラーになるよ!」と怒られます
// console.log(name.toUpperCase());

// だから、ちゃんと「中身があるか?」を確認(ガード)します
if (name !== null) {
console.log(name.toUpperCase()); // ここにたどり着いた時は、絶対に string だとTypeScriptが安心してくれる
} else {
console.log(“名前が登録されていません”);
}
}

「わざわざ `if` でチェックするの面倒だな……」と思うかもしれませんが、これによって「本番環境で突然アプリが落ちた!」という悪夢のようなバグを未然に防ぐことができるんです。

—

3. `strictFunctionTypes` :「関数の代入ルールを厳格に守ってね!」

例え話:専門的なアルバイトのシフト

少しだけ高度ですが、大切な概念です。
例えば、「犬の散歩ができる人(動物全般OK)」を募集しているアルバイト枠に、「トイプードルしか触れない人」を配置しようとしたらどうでしょう? 「他の大型犬が来たら対応できないじゃん!」と現場がパニックになりますよね。

関数も同じで、「より広い範囲のデータを受け取れる関数」を、「狭い範囲のデータしか扱えない場所」に代入しようとすると、危険なのでTypeScriptが止めてくれます。

コードで見てみよう

// 動物(Animal)を扱う基本の型
interface Animal {
name: string;
}

// 犬(Dog)は、Animalの特殊なパターン(子孫)とします
interface Dog extends Animal {
bark(): void;
}

// 犬だけを受け取って処理する関数
let handleDog = (dog: Dog) => {
dog.bark();
};

// 動物全般を受け取って処理する関数
let handleAnimal = (animal: Animal) => {
console.log(animal.name);
};

// ❌ 【strictFunctionTypes が防いでくれること】
// 「犬専用の関数」を入れなきゃいけない場所に、「どんな動物でも来い!という関数」を代入しようとすると、
// 安全性の観点からエラーにしてくれます。
// handleDog = handleAnimal; // ここでエラーが出て事故を防ぎます!

最初は少し難しく感じるかもしれませんが、要するに「関数の引数の互換性を、もっと安全な方向だけに絞るよ」というルールです。

—

エラーが出ても、それはTypeScriptからの「愛のメッセージ」

いかがでしょうか? `strict: true` の世界は、一見すると「あれもダメ、これもダメ」と小言が多い厳格な親父のように感じるかもしれません。

ですが、TypeScriptが発するエラーメッセージは、あなたのコードの粗探しをしているのではなく、「ねぇ、このままだと後で絶対に困るから、今のうちにこう直しておこうよ!」と教えてくれる、優しくて頼れる相棒からのアドバイスです。

もし真っ赤なエラーが出てしまっても、深呼吸して一つずつメッセージを読んでみてください。「あ、ここが `null` になるかもしれないから、 `if` でチェックすればいいんだな」と気づけるようになると、TypeScriptを書くのがどんどん楽しく、そして自信に満ちたものに変わっていきますよ。

それでは、快適で安全なTypeScriptライフを一緒に楽しんでいきましょう!

コメント

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