構造的部分型
structural subtyping
型の構造だけを見て、派生型 (derived type)かどうかを判定する
公称的部分型のように明示的にclass A implements B{}のように書かなくても、構造が同じであれば派生型だと判定される
静的にチェックできるダックタイピング
#WIP
これがokになるということ
code:ts
type Human = {
name: string;
age: number;
}
type Human2 = {
name: string;
age: number;
}
const human1: Human = {..}
const f = (human: Human2) => {...}
f(human1)
構造的部分型のわかりやすい例 ref
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の引数として実行できている
言語
OCaml、TypeScriptなど
Goのinterfaceもこれ
Interfaceを用意するが、継承や実装はしないで良い
引数の型をこのinterfaceにすれば、底に入るオブジェクトは、そのinterfaceを実装していないが、構造が同じであれば実行できる
動的型付けっぽいけど、コンパイル時にチェックできるので静的なダックタイピングっぽい
Scala ?
#??
tsってなんのために構造的部分型なん?
https://typescript-jp.gitbook.io/deep-dive/getting-started/why-typescript#gou-zao-de-bu-fen-xing-structural-typing
公称的部分型と構造的部分型のメリデメを知りたい
TypeScriptでは
TypeScript の構造的部分型とプリミティブ型について - 30歳からのプログラミング
わかりやすい
Freshnessという挙動がある ref
https://typescript-jp.gitbook.io/deep-dive/type-system/type-compatibility
公称的部分型を使う方法
TypeScriptでNominal Typingを実現する4つの方法 - Qiita
Nominal Typing - TypeScript Deep Dive 日本語版
実装されそう
https://github.com/Microsoft/TypeScript/issues/202
https://github.com/microsoft/TypeScript/pull/33038
参考
TypeScriptの型は「構造的部分型」という種類らしい。 - Qiita
コード例がわかりやすい
まつもとゆきひろさん,楽しくプログラミングができる Ruby3の型の提案 〜RubyKaigi 2016 基調講演 1日目:RubyKaigi 2016レポート|gihyo.jp … 技術評論社
Rubyの話。
あくまでも動的型付けのままだが、実際のコードやテストから型情報を推論し、構造的部分型の静的型チェックを目指したい、みたいな話
Scalaなのでよんでない
https://yuroyoro.hatenablog.com/entry/20110126/1296044588
http://osiire.hatenablog.com/entries/2009/11/05
https://yuwki0131.github.io/posts-output/2018-04-20-scala-types/
http://sofksoak.hatenadiary.jp/entry/20120703/p1
http://osiire.hatenablog.com/entry/20091105
https://en.wikipedia.org/wiki/Substructural_type_system
https://typescriptbook.jp/reference/values-types-variables/structural-subtyping