Slide 1

Slide 1 text

クラスメソッド株式会社 TSKaigi Kansai 2024.11.16 as(型アサーション)を書く前にできること maroKanatani

Slide 2

Slide 2 text

Classmethod 自己紹介     Frontend Ops ...etc maroKanatani ソフトウェアエンジニア ほぼフロントエンドエンジニア Japan AWS All Certifications Engineer (2022~2024)

Slide 3

Slide 3 text

as 使ってますか?

Slide 4

Slide 4 text

TSのコードレビューをしていて感じること any の濫用はよくない という風潮はある程度広まってきた …しかし as の濫用については any ほど広まってなさそう 有効な場面もあるが、カジュアルに使われることも多い印象 (適切に使っている人には釈迦に説法な話かも) > 理解が浅い人が真似することで良くない使い方が割れ窓的に広がることがある

Slide 5

Slide 5 text

なぜ as の濫用は良くないのか コンパイラの挙動を上書きしてしまう コンパイラよりも型について理解している場合は as を用いても良い? > 力には責任が伴う 潜在的に any と同様の副作用があるとも言える >(自分は理解しているつもりでも)チームの他のメンバーは違うかもしれない とはいえ全く使わないのは難しい > スコープを最小限に留める、コメントを書くなどして用法用量を守る あくまで「濫用」が良くない

Slide 6

Slide 6 text

こんなコード書いていませんか?

Slide 7

Slide 7 text

こんなコード書いていませんか? いずれもサブタイプ関係にあるスーパータイプを サブタイプで型アサーションしているのが良くない

Slide 8

Slide 8 text

こんなコード書いていませんか?(修正版)

Slide 9

Slide 9 text

こんなコード書いていませんか?(修正版) 基本的にはちゃんと型ガードする

Slide 10

Slide 10 text

タグ付きユニオンを使ったリファクタ

Slide 11

Slide 11 text

タグ付きユニオンを使ったリファクタ 個別のプロパティをチェックするサンプルが多いが 判別用のプロパティを生やすのも場合によっては有効

Slide 12

Slide 12 text

zod を使った Scheme First なリファクタ

Slide 13

Slide 13 text

zod を使った Scheme First なリファクタ 型はスキーマから作成 パースする

Slide 14

Slide 14 text

インターフェース境界での as には要注意

Slide 15

Slide 15 text

インターフェース境界での as には要注意 role が string型に推論されるため as を使っている

Slide 16

Slide 16 text

インターフェース境界での as には要注意 role が string型に推論されるため as を使っている プロパティが増減した場合に 型エラーが発生しない

Slide 17

Slide 17 text

インターフェース境界での as には要注意(修正版)

Slide 18

Slide 18 text

インターフェース境界での as には要注意(修正版) 型制約をつける or satisfies を使う

Slide 19

Slide 19 text

as が必要な例

Slide 20

Slide 20 text

as が必要な例 result をミュータブルな オブジェクトとして扱っている 参考: 敗北者のTypeScript (https://qiita.com/uhyo/items/aae57ba0734e36ee846a) as が有効なスコープが最小限に留まっている

Slide 21

Slide 21 text

as を書く前に 型ガードや型制約、satisfiesで済ませられないか? 必要になる根本的な原因は何か? 割れ窓的に広がらないように必要に応じてコメントも書こう 実態に合わせてきちんとメンテすることで読み手側の負荷はきっと下がる その as はなぜ必要なのか? 必要な場合はスコープを小さく 型はドキュメント

Slide 22

Slide 22 text

ご清聴ありがとうございました