こんにちは!フロントエンドの現場で日々コードと格闘しているチーフアーキテクトです。
TypeScriptを学び始めたばかりの頃、「`tsconfig.json`」という謎のファイルにズラッと並ぶ設定項目、正直ゾッとしませんか?「全部 `true` にしておけばいいんでしょ?」なんて雑に扱っていると、後で手痛いしっぺ返しを食らうのがこの世界。
今回は、その中でも一見地味だけれど、実は「JavaScriptの悪しき伝統」から私たちを守ってくれる頼もしい門番、`strictBindCallApply` についてお話しします。
—
そもそも、bind, call, apply ってなに?
まずはここからですね。これらはJavaScriptの関数が持っている「特別な道具」です。
- `call` / `apply`: 「今すぐこの関数を実行して!その時、関数の外側にある変数(this)はこれを使ってね」と指定するもの。
- `bind`: 「この設定を覚えさせておくよ。実行するのはあとでね!」という予約機能。
これらは便利なんですが、実は「何でも受け入れちゃう」というガバガバな側面があるんです。TypeScriptの厳格なチェックをすり抜けて、実行時に「そんな引数ないよ!」とエラーになる……そんな悲劇を防ぐのが今回の主役です。
—
`strictBindCallApply` がやってくれること
この設定を `true` にすると、TypeScriptは「おいおい、そんな適当な呼び出し方して大丈夫か?」と、かなり厳しく突っ込んでくれるようになります。
イメージとしては、「お会計のレジ」を想像してください。
- オフの状態: 商品(引数)が何であれ、レジ(関数)はとりあえず受け取っちゃう。「え、そんな商品登録されてないけど……まあいいか、通しちゃえ!」と、後からシステムがクラッシュするパターンです。
- オンの状態: 商品バーコードを読み取るたびに「これ、うちの店の商品じゃないです!」と即座に警告が出る。未然にミスを防ぐ、まさに「守護神」です。
—
実際にコードで見てみよう
まずは、この設定を `true` にした状態で、わざと間違った使い方をしてみます。
// 挨拶をする関数。名前(name)と年齢(age)が必要だよ!
function greet(name: string, age: number) {
console.log(`こんにちは、${name}さん。${age}歳ですね!`);
}
// 間違った使い方(本来は数値が必要なのに、文字列を渡している)
// strictBindCallApply が true なら、ここでTypeScriptが即座に怒ってくれます!
greet.call(null, “太郎”, “二十歳”);
// └─ ここでエラー: ‘string’ 型の引数を ‘number’ 型の引数に割り当てることはできません。
もしこの設定が `false` だったら、TypeScriptは「まあ、動かしてみればわかるでしょ」と見逃してしまいます。結果、ブラウザで動かした瞬間に「あれ?思ったのと違う!」というバグが発生し、深夜のデバッグ大会が開催されることに……。
—
なぜこの設定を「オン」にすべきなの?
「厳しくされると面倒くさい」と感じるかもしれません。でも、考えてみてください。エラーを開発中に見つけるのと、お客さんが使っている時に見つけるの、どちらが怖いですか?
`strictBindCallApply` をオンにすることは、いわば「未来の自分へのプレゼント」です。
1. 予期せぬ実行時エラーが激減する: 「そんなプロパティないよ!」という `undefined` 地獄から解放されます。
2. コードの意図が明確になる: どんな引数が必要なのかが一目瞭然なので、チーム開発でも「あれ、ここ何入れればいいんだっけ?」と悩む時間が減ります。
—
導入のステップ:まずはここから!
もし今、既存のプロジェクトでこの設定を `true` にしようとしてエラーが大量に出たら……焦らなくて大丈夫ですよ。
1. まずは `tsconfig.json` を開く: `”strict”: true` になっているか確認しましょう。実はこれだけで、`strictBindCallApply` も自動的に有効になります。
2. エラーが出たら「握りつぶさない」: エラーが出た場所は、過去の自分が「ちょっと雑に書いちゃった場所」です。一つひとつ、丁寧に関数の引数を確認して直していきましょう。
—
最後に:TypeScriptは敵じゃない
TypeScriptの設定項目は、私たちを縛り付けるための檻(おり)ではありません。むしろ、広大なWeb開発という荒野を歩くための「頑丈な靴」なんです。
最初は窮屈に感じるかもしれませんが、慣れてしまえば「これなしでは不安で開発できない!」と思うようになるはず。ぜひ、今日から `strictBindCallApply` の恩恵を感じながら、安全で楽しいコーディングライフを送ってくださいね。
もし分からないことがあれば、いつでもまた聞きに来てください。あなたの挑戦を、現場の最前線から応援しています!

コメント