Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Interface vs Types ~型推論が過多推論~

Interface vs Types ~型推論が過多推論~

tskaigi 2025 LT Day1で発表したスライドです。

「推論のパフォーマンスで困ったらInterafaceを使いましょう」

Avatar for Hiroki Omote

Hiroki Omote

May 26, 2025
Tweet

Other Decks in Programming

Transcript

  1. omote 表 洋樹  マラソ  ガンダム 趣味 Design Engineer

    Manager Tech Lead Freelancer 2012 2019 2022 Scheeme BUBO
  2. なぜ、anyになったのか 複雑な交差型 特定のケースで最終的に any 型に落ち る。 TypeScriptの型システムの計算の限界 と推論の妥協に起因。 Mantineの型 ×

    自前の型 これにより計算量が爆増した。 ライブラリ内にあった型を流用し、交 差型として使用した。 落とし穴 開発時は推論できていた。
 ビルド時に内部的に複雑化し、最終結 果がanyになった。 エニーは型を知らない キラキラ
  3. 計算量が増えるケース 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 type type extends infer const const typeof DeepArray DeepArray []; Flatten ( )[] Flatten ; deeplyNested DeepArray DeepArray DeepArray [ [[ ], [ ]], [[[ ]]] ]; flattened Flatten deeplyNested ; < > = | < > < > = ? < > : : < < <number>>> = : < > = T T T T T U U T // 再帰的にすべてのネストを展開する型 // 型推論が限界を超えると、ここで `any` として扱われる可能性あり 1 2 3 1 Recursive Type 再帰的にネストが展開され、無限に近 い計算が発生します。 TypeScriptはこのようなケースで型の 推論を放棄し、any にフォールバック することがあります。 ※ver3.7でRecursive typeの扱いは改善 エニーは型を知らない キラキラ
  4. 宣言をinterfaceに変えただけです。 型自体は何も編集していません。 Interfaceを使え、とAIが言っている type → interface 1 2 3 4

    5 type keyof Props Omit ComponentPropsWithoutRef , ButtonProps Omit ButtonProps, { variant ; color ; }; = < < > > & < > & ?: | | ?: | | 'button' 'unstyled' 'filled' 'outlined' 'text' 'default' 'subdued' 'caution' 1 2 3 4 interface extends keyof Props Omit ComponentPropsWithoutRef , ButtonProps , Omit ButtonProps, { variant ; color ; } < < > > < > ?: | | ?: | | 'button' 'unstyled' 'filled' 'outlined' 'text' 'default' 'subdued' 'caution'
  5. なぜこれで解決できるか typeにおける交差型は型演算の対象 型レベルで演算されて解決される必要がある。
 型の深さや複雑さによって any に落ちる可能性が高くなる。 interface はマージベースで解決される interface はマージされるため、TypeScriptの型解決の負荷が

    下がる。 interface 同士は「拡張」に近い 「構造の統合」ではなく、型計算を遅延させた構文にる。
 TypeScriptの型システムとしては「負担が少ない」=any に落 ちにくくなるという特性がある。
  6. type interaface 条件型 ・使用可 不可 拡張(継承) H & を使って交差型として合8 H

    同名のtypeは許可しない H extends で継承可能(複数継承も可y H 同名の interface を自動で統合 パフォーマンス(型計算) H 計算量によっては型爆発の可能性 H 遅延評価するので、パフォーマンス高 typeとInterfaceの比較表