- 2024/11/16
- https://kansai.tskaigi.org/
TypeScriptの型システムは万能機械の夢を見るか?
- canalun(かなるん)さん
- https://docs.google.com/presentation/d/1hnvPiSCI2UBIZ0x5OTl3ZFHvIGMIl3g37It1_Qd7hNA/edit
型システム
- 型システムでどこまで複雑な処理を解けるか
- 有限オートマトン
- booleanで返す問題を解ける
- チューリングマシン
- スタックを無限に伸びるテープにする
- アルゴリズムを実現できる
- これを超える仕組みはない
- TSの型システムでチューリングマシンを実現できる
- 繰り返しと条件分岐と順次実行ができればチューリング完全になる
型チェック 速度改善 奮闘記
- Kenta TSUNEMIさん
速度改善
- モノレポで多くのモジュールが入り組んでいる
- tscに数十秒かかっていて半分くらいになった
- Redux Toolkitの型推論が効果絶大
- reducerの引数のstateがinitialStateから推論されてて重かった
- 型定義を直接書かずにtypeで定義することでキャッシュがきいてはやくなった
- ExtractによるInstantiation
- Extractのチェックに時間がかかっていた
- Extractやめて関数オーバーロードすることではやくなった
- ただしコード量は増えてしまっている
- 不要なスキーマチェック削除
- VSCode上での課題
- 調査
型付き API リクエストを実現するいくつかの手法とその選択
API連携
- APIを型安全にするために
- コードファーストなものそうでないもの
- コードファーストじゃないと実装と使用が乖離してしまうなど管理が大変
- コードファーストなら型の恩恵が大きい
- TSならではの手法
- 型定義の共有
- ライブラリなしでできる
- fetchの中では型きかない
- zodのスキーマ共有
- モデルの定義に基づいたバリデーションできる
- バリデーションを共有できる
- いずれもモノレポであること前提
- 型定義の共有
- 言語に依存しない方法
- OpenAPI
- 仕様が標準化されている
- エコシステムが充実
- 部分的な採用もできる
- gRPCやGraphQLもある
- OpenAPI
- OpenAPI
複雑なフロントエンド(ノーコード)を堅牢に作る
シナリオテスト
- 実際のユーザの操作にあわせてAPIをたたいていくテスト
- グラフ状に分岐は増えてパターンが多い
- これを管理するツールを作った
- ノーコードツールは状態管理が大変
- Reactで作るけどReactに依存しないところで管理したい
- JotaiのAtomを通じて外部のstateの変化に応じて更新処理を動かす
- Effect
- successとerrorとrequirementsを型に持つ
- 割り算の関数だとsuccessがnumberでerrorがError
- requirementsは処理を動かすための依存
構造的型付けと serialize 境界
安全なシリアライズ
- JSオブジェクトを文字列化するとき
- 丸ごと文字列化すると意図しないプロパティが入ってるとそれまで文字列化されてしまう
- TSの型は余計なプロパティが入っててもエラーにならない
- 検索系のURLが歴史的経緯で種類が多い
- 起きたこと
- 旧クエリを新クエリに変換するのを忘れてprefetch投げた
- オプショナル多いから型エラーがでなかった
- 旧クエリに特定のフィールドがあるときに問題が起きた
- 解決策
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた
- Kanonさん
- https://speakerdeck.com/ysknsid25/tesutokodopin-zhi-wogao-merutamenimutation-testingraiburaristrykerwoshi-zhan-dao-ru-sitemita
Mutation Test
- Mutation Test
- 意図的にバグを植え付けてテストが落ちることを検証するテスト
- Stryker
- Mutation Testのライブラリ
- 自動で変異を作ったりレポートしたりしてくれる
- Strykerを導入
- ライブラリ入れてvitestとかのプラグイン入れるだけ
- そのままだと実行時間がとてつもなく長くなる
- 数秒だったやつが数時間に
- 変異を入れるファイルと変異の種類を絞ると良い
- 絞っても数十分とか
- incrementalオプションで差分実行になる
- 初回は全実行
- 次からはdiffがあるところだけ実行