未然にバグを防ぐ方法
どの言語にも当てはまるもの
重要度順
静的型付け言語にする
Linterやオートフォーマッターを導入する
関数ごとにドキュメンテーションする
自動テスト
注意:異常系もテストする
適切なIDEを使う
秀丸エディタやサクラエディタとかでコーディングしない
VimユーザーはNeovimにしてLSPを整える
コードレビューを実施する
CI環境を整えてレビューの負担を減らす
バージョン管理ツールを使用して差分を明確にする
ペアプログラミング・モブプログラミングをする
各言語用テクニック
Java
null安全なScala or Kotlinに移行する
TypeScript
anyは絶対に使わない
代わりにunknownを使う
アサーションは次の場合以外使わない
as(型アサーション)Mijinko_SD.icon
DOM操作
REST API呼び出し
可能ならwrapperを作るべき
tsconfig.jsonの設定をちゃんとやるMijinko_SD.icon
最低限、以下の設定は有効にする
strict
noUncheckedIndexedAccess
おまえら禁じられたインデックスアクセスを平気で使ってんじゃねえか!わかってんのか?『ランタイムエラー』が生まれたのは人間がコンパイラオプションに甘えたせいだろうがよ!
他にも必要なのあるかも
noFallthroughCasesInSwitch
以下のようなcase処理を禁止する
code:exampleForNoFallthroughCasesInSwitch.ts
switch (foo) {
case 1:
case 2:
// 処理
break
// 1と2をまとめているけれど、連続している(個別の処理はない)のでエラーにはならない
case 3:
// 処理
// 処理の後にbreakが無いのでエラーになる
case 4:
// 処理
break
default:
break
}
これはお好みで
可読性の面では有効にした方が良さげ
意図的にfallthroughしたいときに困るんだよな~bsahd.icon
意図してやる際は@ts-expect-errorつければ行単位でエラーを無効化できますMijinko_SD.icon
コメントがあった方がそれが意図的なのかわかりやすくなるので、検知する設定自体は有効にしたままで良いかと
ESLint導入後、適切な設定を行う
awaitし忘れやPromise非対応の引数に非同期コールバックを渡してしまうことはよくあるので、対策する
no-floating-promises | typescript-eslint
awaitし忘れを防止するルール
意図的にawaitしていない場合はeslint-disable-next-lineを使用してマークする
一手間あるけれどコメントがあった方が意図的なのかがわかって良い
no-misused-promises | typescript-eslint
Promiseに対応していない引数に非同期関数を渡すことを防止するルール
TS Resetを使う
試したことないからほんとに効果あるかはわからないけどMijinko_SD.icon
結構簡単に導入できて効果もありました
Array.prototype.includes()のクソみたいな型定義を修正してくれるらしい
https://zenn.dev/come25136/articles/db4f055f712f74
https://qiita.com/tenda_ryo_y/items/28db71dd4271cc6562d4
人の目にあまり触れられていない、もしくは直近2年間以内に更新されていないパッケージを使わない
npmなら週間ダウンロード数を確認できる
PRを溜め込んでいるリポジトリはメンテナンスが間に合っていない可能性が高い
最低限repoがdecrepartedになっていないことを確認する