構造的部分型
structural subtyping
公称的部分型のように明示的にclass A implements B{}のように書かなくても、構造が同じであれば派生型だと判定される これがokになるということ
code:ts
type Human = {
name: string;
age: number;
}
type Human2 = {
name: string;
age: number;
}
const human1: Human = {..}
const f = (human: Human2) => {...}
f(human1)
code: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の引数として実行できている
言語
Interfaceを用意するが、継承や実装はしないで良い
引数の型をこのinterfaceにすれば、底に入るオブジェクトは、そのinterfaceを実装していないが、構造が同じであれば実行できる
動的型付けっぽいけど、コンパイル時にチェックできるので静的なダックタイピングっぽい Scala ?
tsってなんのために構造的部分型なん?
わかりやすい
実装されそう
参考
コード例がわかりやすい
Rubyの話。
あくまでも動的型付けのままだが、実際のコードやテストから型情報を推論し、構造的部分型の静的型チェックを目指したい、みたいな話
Scalaなのでよんでない