より良いTypeScript開発のために、strictBindCallApplyはtrueにしよう

strictBindCallApply ってなに?

  • tsconfig のオプションのひとつ
  • デフォルトでは false (厳密なチェックはしない) 設定になっています

strictBindCallApply: false のままだとどうなるの?

  • false のままだと、bind, call, apply を使う時に type safe でないコードになってしまいます

「type safe ではない」ってどういうこと?

type safe じゃないと何が困るの? type safe になると何が嬉しいの?

  • 例えば、

    const value1 = 100;
    const value2 = "100";
    
    updateSize.bind(this)({
      width: value1,
      hieght: value2,
    });

    みたいな、height のスペルが間違ってる、value2 が number じゃないのに突っ込んじゃったり…というコードが生まれます

  • 早い話、DX が落ちます
  • type safe になると、IDE や VSCode で lint error が出たり、コード補完が効くようになります

bind, call, apply って使わないよね?(どんなときに使うの?)

  • 確かに使わないといけない機会は多くないです
  • 例えば bind だと、サードパーティーのライブラリを使う時に this の引き渡しが必要になったりすることがあります

逆に strictBindCallApply: true にして困ることってある?

  • 全くありません
    • 新規プロジェクトでも既存プロジェクトでも、すべからく true にした方がいいです
  • 既存プロジェクトでも bind, call, apply しているメソッドは正常に動いているはず(動いていないといけないはず)なので、lint error でリスクを炙り出せるのは有効です

strict: true でいいんじゃないの?

よくご存知で。

たしかに strict: true を設定すれば、今回紹介した strictBindCallApply をはじめ、strictNullChecksstrictFunctionTypes などいくつかのオプションがまとめてONになり、最も type safe な設定になります。

ただしこれまで strict: false で運用してきたプロジェクトに関してはかなりの変更検知が予想されますし、また今後 TypeScript のバージョンアップに伴って新しいオプションが strict: true で有効化される対象として入る可能性もあるので、個別具体的・明示的な設定にはならないという懸念も出てきます。

参考: https://www.typescriptlang.org/tsconfig#strict

プロジェクトの状態に合わせて書き方は変えていただければと思います。

まとめ

というわけで、今すぐ strictBindCallApply: true (または strict: true) を設定しましょう!