Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

型のインスタンス化は非常に深く、無限である可能性があります。

 型のインスタンス化は非常に深く、無限である可能性があります。

TSKaigi Kansai 2024 振り返り勉強会 で話した時のスライドです。
https://toggle.connpass.com/event/337428/

Kimita Shoichi

November 25, 2024
Tweet

More Decks by Kimita Shoichi

Other Decks in Programming

Transcript

  1. 4
 © toggle holdings inc. アジェンダ © toggle holdings inc.

    • 弊社の開発環境 • 発生した問題と解決方法 • 今後どのように考えているか • まとめ
  2. 6
 © toggle holdings inc. 開発環境 © toggle holdings inc.

    フロントエンド 
 バックエンド 

  3. 7
 © toggle holdings inc. 開発環境 © toggle holdings inc.

    Monorepo • バックエンドとフロントエンドのそれぞれコードが 1つのリポジトリに まとまっているので変更を追いやすい • 型の共通化をしやすい • フルスタックに開発しやすい
  4. 11
 © toggle holdings inc. 開発環境 © toggle holdings inc.

    フロントエンド 
 バックエンド 
 zod zodios
  5. 12
 © toggle holdings inc. Zodとは? © toggle holdings inc.

    • TS・JSで利用できるスキーマ定義とバリデーションライブラリ • スキーマを宣言的にコードで定義 • スキーマに基づいて、データのバリデーションを行う • スキーマからの型を自動生成できる 詳しくは こちら
  6. 15
 © toggle holdings inc. Zodiosとは? © toggle holdings inc.

    • 型安全なAPIクライアントを作成するためのライブラリ • Axiosをベースで Zodスキーマを活用 ◦ イメージは型つきの Axios • リクエストとレスポンスの型を自動的に生成 • API通信時に型チェックが実行される • エンドポイントを宣言的に定義するだけ 詳しくは こちら
  7. 23
 © toggle holdings inc. なぜ起こったのか? © toggle holdings inc.

    Zodiosで定義したエンドポイントが多く Zodスキーマを多重に参照しているため 型のネストが深くなりすぎている
  8. 24
 © toggle holdings inc. なぜ起こったのか? © toggle holdings inc.

    • TypeScript のコンパイラが「無限に再帰している」と誤検知 ◦ コンパイラが型を完全に解釈しようとする過程で再帰が終了す る条件を検出できない
  9. 25
 © toggle holdings inc. なぜ起こったのか? © toggle holdings inc.

    無限ループしているように見える状態 深すぎるネストのせいで計算が過剰に複雑化している 実際は
  10. 27
 © toggle holdings inc. 一見問題がないように見える例 以下の条件が加わるとエラーが発生する可能性 • エンドポイント数が多い •

    スキーマが他のスキーマを参照して連鎖的に 深くなる • Zodios の型推論がすべてのエンドポイントを 展開しようとする
  11. 28
 © toggle holdings inc. ✅ エンドポイント数が多い ➡ 80を超えるエンドポイントをひとまとめに ✅

    スキーマが他のスキーマを参照して連鎖的に 深くなる ➡ スキーマ同士の依存関係がめちゃあった ✅ Zodios の型推論がすべてのエンドポイントを 展開しようとする ➡ 多分展開しようとしていた
  12. 33
 © toggle holdings inc. 今後どのように考えているか © toggle holdings inc.

    • 分割することでエラーは回避できたが、暫定対応にすぎない ◦ 数が多くなったらまた発生するのでは? • Zodios が1年くらいメンテナンスされていない ◦ 移行先を見つける?
  13. 35
 © toggle holdings inc. 移⾏先候補 © toggle holdings inc.

    • Effect ◦ https://effect.website/ • TS-REST ◦ https://ts-rest.com/ • Hono純正のRPC機能 ◦ https://hono.dev/docs/guides/rpc
  14. 36
 © toggle holdings inc. Effect © toggle holdings inc.

    • 主にエラーハンドリング、リソース管理、並行処理を強力にサポー トするライブラリ • Effectそのものが ZodiosのようなAPIクライアントを作成するライ ブラリではない ◦ ただし、そのような構築は可能
  15. 37
 © toggle holdings inc. TS-REST © toggle holdings inc.

    • TypeScriptを用いて新規および既存の APIに対して段階的に型 安全性を導入するためのライブラリ • Zodiosとほぼ同じような記述方法で APIクライアントとして活用で きる
  16. 38
 © toggle holdings inc. Hono純正のRPC機能 © toggle holdings inc.

    • Zodをそのままに新たにライブラリを追加しなくても利用できる唯 一の移行先候補 • バックエンドで Honoを利用、現段階では最有力候補
  17. 39
 © toggle holdings inc. TypeScript 5.6では、大きなファイルでもIDEが高速に感じら れるようになります。 TSは、目に見えるコードだけを優先的に表示するようになり ます。

    52k行のファイルでは、レスポンスタイムが3秒から140msに なった。 これは、生成されるTSコードが多いプロジェクトでは大きな 違いになるだろう。 🤔🤔🤔🤔 🤔🤔 Our current version is 5.4 ….. :(