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
) を設定しましょう!