型のインスタンス化は非常に深く、無限である可能性があります。
by
Kimita Shoichi
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
1 本資料は、トグルホールディングス株式会社に許可なく複製・転載をしないようお願いします。 型のインスタンス化は 非常に深く、無限である 可能性があります。 Type instantiation is excessively deep and possiblyinfinite.
Slide 2
Slide 2 text
2 © toggle holdings inc. 君⽥ 祥⼀ 所属 2023/11〜現在 トグルホールディングス株式会社 X @kimi_koma1111 よろしくお願いします!
Slide 3
Slide 3 text
3 © toggle holdings inc. 型のインスタンス化は非常に深く 無限である可能性があります。 Type instantiation is excessively deep and possibly infinite.
Slide 4
Slide 4 text
4 © toggle holdings inc. アジェンダ © toggle holdings inc. ● 弊社の開発環境 ● 発生した問題と解決方法 ● 今後どのように考えているか ● まとめ
Slide 5
Slide 5 text
5 © toggle holdings inc. 弊社の開発環境
Slide 6
Slide 6 text
6 © toggle holdings inc. 開発環境 © toggle holdings inc. フロントエンド バックエンド
Slide 7
Slide 7 text
7 © toggle holdings inc. 開発環境 © toggle holdings inc. Monorepo ● バックエンドとフロントエンドのそれぞれコードが 1つのリポジトリに まとまっているので変更を追いやすい ● 型の共通化をしやすい ● フルスタックに開発しやすい
Slide 8
Slide 8 text
8 © toggle holdings inc. 開発環境 © toggle holdings inc. こちら
Slide 9
Slide 9 text
9 © toggle holdings inc. 開発環境 © toggle holdings inc. こちら
Slide 10
Slide 10 text
10 © toggle holdings inc. 型の共通化
Slide 11
Slide 11 text
11 © toggle holdings inc. 開発環境 © toggle holdings inc. フロントエンド バックエンド zod zodios
Slide 12
Slide 12 text
12 © toggle holdings inc. Zodとは? © toggle holdings inc. ● TS・JSで利用できるスキーマ定義とバリデーションライブラリ ● スキーマを宣言的にコードで定義 ● スキーマに基づいて、データのバリデーションを行う ● スキーマからの型を自動生成できる 詳しくは こちら
Slide 13
Slide 13 text
13 © toggle holdings inc. © toggle holdings inc.
Slide 14
Slide 14 text
14 © toggle holdings inc. © toggle holdings inc.
Slide 15
Slide 15 text
15 © toggle holdings inc. Zodiosとは? © toggle holdings inc. ● 型安全なAPIクライアントを作成するためのライブラリ ● Axiosをベースで Zodスキーマを活用 ○ イメージは型つきの Axios ● リクエストとレスポンスの型を自動的に生成 ● API通信時に型チェックが実行される ● エンドポイントを宣言的に定義するだけ 詳しくは こちら
Slide 16
Slide 16 text
16 © toggle holdings inc. © toggle holdings inc.
Slide 17
Slide 17 text
17 © toggle holdings inc. 発生した問題と解決方法
Slide 18
Slide 18 text
18 © toggle holdings inc.
Slide 19
Slide 19 text
19 © toggle holdings inc. エディタで型推論できなくなった
Slide 20
Slide 20 text
20 © toggle holdings inc. TypeCheckが通らなくなった
Slide 21
Slide 21 text
21 © toggle holdings inc. 型のインスタンス化は非常に深く 無限である可能性があります。 Type instantiation is excessively deep and possibly infinite.
Slide 22
Slide 22 text
22 © toggle holdings inc. なぜ起こったのか?
Slide 23
Slide 23 text
23 © toggle holdings inc. なぜ起こったのか? © toggle holdings inc. Zodiosで定義したエンドポイントが多く Zodスキーマを多重に参照しているため 型のネストが深くなりすぎている
Slide 24
Slide 24 text
24 © toggle holdings inc. なぜ起こったのか? © toggle holdings inc. ● TypeScript のコンパイラが「無限に再帰している」と誤検知 ○ コンパイラが型を完全に解釈しようとする過程で再帰が終了す る条件を検出できない
Slide 25
Slide 25 text
25 © toggle holdings inc. なぜ起こったのか? © toggle holdings inc. 無限ループしているように見える状態 深すぎるネストのせいで計算が過剰に複雑化している 実際は
Slide 26
Slide 26 text
26 © toggle holdings inc. 例えば 例えば
Slide 27
Slide 27 text
27 © toggle holdings inc. 一見問題がないように見える例 以下の条件が加わるとエラーが発生する可能性 ● エンドポイント数が多い ● スキーマが他のスキーマを参照して連鎖的に 深くなる ● Zodios の型推論がすべてのエンドポイントを 展開しようとする
Slide 28
Slide 28 text
28 © toggle holdings inc. ✅ エンドポイント数が多い ➡ 80を超えるエンドポイントをひとまとめに ✅ スキーマが他のスキーマを参照して連鎖的に 深くなる ➡ スキーマ同士の依存関係がめちゃあった ✅ Zodios の型推論がすべてのエンドポイントを 展開しようとする ➡ 多分展開しようとしていた
Slide 29
Slide 29 text
29 © toggle holdings inc. 解決方法
Slide 30
Slide 30 text
30 © toggle holdings inc. 分割した
Slide 31
Slide 31 text
31 © toggle holdings inc. ある程度意味のあるまとまりにして分割 ✅ ネストを浅くしたことにより型推論の範囲が限定 ✅ コンパイラが一度に扱う型の範囲が限定され、 処理負荷が分散
Slide 32
Slide 32 text
32 © toggle holdings inc. 今後どのように考えているか
Slide 33
Slide 33 text
33 © toggle holdings inc. 今後どのように考えているか © toggle holdings inc. ● 分割することでエラーは回避できたが、暫定対応にすぎない ○ 数が多くなったらまた発生するのでは? ● Zodios が1年くらいメンテナンスされていない ○ 移行先を見つける?
Slide 34
Slide 34 text
34 © toggle holdings inc. Zodios 移行する?
Slide 35
Slide 35 text
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
Slide 36
Slide 36 text
36 © toggle holdings inc. Effect © toggle holdings inc. ● 主にエラーハンドリング、リソース管理、並行処理を強力にサポー トするライブラリ ● Effectそのものが ZodiosのようなAPIクライアントを作成するライ ブラリではない ○ ただし、そのような構築は可能
Slide 37
Slide 37 text
37 © toggle holdings inc. TS-REST © toggle holdings inc. ● TypeScriptを用いて新規および既存の APIに対して段階的に型 安全性を導入するためのライブラリ ● Zodiosとほぼ同じような記述方法で APIクライアントとして活用で きる
Slide 38
Slide 38 text
38 © toggle holdings inc. Hono純正のRPC機能 © toggle holdings inc. ● Zodをそのままに新たにライブラリを追加しなくても利用できる唯 一の移行先候補 ● バックエンドで Honoを利用、現段階では最有力候補
Slide 39
Slide 39 text
39 © toggle holdings inc. TypeScript 5.6では、大きなファイルでもIDEが高速に感じら れるようになります。 TSは、目に見えるコードだけを優先的に表示するようになり ます。 52k行のファイルでは、レスポンスタイムが3秒から140msに なった。 これは、生成されるTSコードが多いプロジェクトでは大きな 違いになるだろう。 🤔🤔🤔🤔 🤔🤔 Our current version is 5.4 ….. :(
Slide 40
Slide 40 text
40 © toggle holdings inc. まとめ TypeScriptにあまり無理をさせず 計算量が少なく、シンプルになるように 開発者も気をつける
Slide 41
Slide 41 text
41 本資料は、トグルホールディングス株式会社に許可なく複製・転載をしないようお願いします。 ご清聴 ありがとうございました