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
 本資料は、トグルホールディングス株式会社に許可なく複製・転載をしないようお願いします。 ご清聴 ありがとうございました