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の引き渡しが必要になったりすることがあります- GROWI 開発では remark/rehype plugin を書く時 に利用しました
逆に strictBindCallApply: true にして困ることってある?
- 全くありません
- 新規プロジェクトでも既存プロジェクトでも、すべからく true にした方がいいです
- 既存プロジェクトでも
bind,call,applyしているメソッドは正常に動いているはず(動いていないといけないはず)なので、lint error でリスクを炙り出せるのは有効です
strict: true でいいんじゃないの?
よくご存知で。
たしかに strict: true を設定すれば、今回紹介した strictBindCallApply をはじめ、strictNullChecks や strictFunctionTypes などいくつかのオプションがまとめてONになり、最も type safe な設定になります。
ただしこれまで strict: false で運用してきたプロジェクトに関してはかなりの変更検知が予想されますし、また今後 TypeScript のバージョンアップに伴って新しいオプションが strict: true で有効化される対象として入る可能性もあるので、個別具体的・明示的な設定にはならないという懸念も出てきます。
参考: https://www.typescriptlang.org/tsconfig#strict
プロジェクトの状態に合わせて書き方は変えていただければと思います。
まとめ
というわけで、今すぐ strictBindCallApply: true (または strict: true) を設定しましょう!
