generated at
構造的部分型
structural subtyping
型の構造だけを見て、派生型 (derived type)かどうかを判定する
公称的部分型のように明示的に class A implements B{} のように書かなくても、構造が同じであれば派生型だと判定される
静的にチェックできるダックタイピング







これがokになるということ
ts
type Human = { name: string; age: number; } type Human2 = { name: string; age: number; } const human1: Human = {..} const f = (human: Human2) => {...} f(human1)


構造的部分型のわかりやすい例 ref
ts
interface Human { brain(): string; body(): string; } // Humanを継承していない, ただのObject const chimera = { brain: () => '大人', body: () => '子供', age: () => 1000 }; // 引数にはHuman型を取る const cry = (one: Human) => `見た目は${one.body()}、頭脳は${one.brain()}`; console.log(cry(chimera)); // ←これが通る
Child クラスをなどを作って明示的に Human を継承していなくても cry の引数として実行できている





言語
Goのinterfaceもこれ
Interfaceを用意するが、継承や実装はしないで良い
引数の型をこのinterfaceにすれば、底に入るオブジェクトは、そのinterfaceを実装していないが、構造が同じであれば実行できる
動的型付けっぽいけど、コンパイル時にチェックできるので静的なダックタイピングっぽい
Scala ?


tsってなんのために構造的部分型なん?
公称的部分型構造的部分型のメリデメを知りたい


わかりやすい
Fleshnessという挙動がある ref
公称的部分型を使う方法
実装されそう


参考
コード例がわかりやすい
Rubyの話。
あくまでも動的型付けのままだが、実際のコードやテストから型情報を推論し、構造的部分型の静的型チェックを目指したい、みたいな話
Scalaなのでよんでない