メモ
interface Fooer { foo: number; } interface Barer { bar: string; } var AcceptFooer = (fooer: Fooer) => { console.log("Its foo is ", fooer.foo); } var AcceptBarer = (barer: Barer) => { console.log("Its bar is ", barer.bar); } var both = { foo: 1000, bar: "ほげ", // 余計なものがあっても、 // インターフェース定義さえ満たば // 型制約突破できる (=ダックタイピング) extraProperty: true }; AcceptFooer(both); AcceptBarer(both); /* 以下のものはコンパイル通らない var myFooer = { foo: "おっぱい" }; // fooのtypeが違うから AcceptFooer(myFooer); // barが無いから AcceptBarer(myFooer); */
ちなみに
@otiai10 静的型付けなので、ダックタイピングより構造的部分型(structural subtyping)と呼ぶほうが多いですね。
— わかめ@TypeScriptカッコガチ (@vvakame) 2014, 6月 12
@otiai10 要求された型に対して実際に渡す型の構造がスーパータイプとサブタイプの関係であれば、まぁ宣言上関係性がなくても実装上互換性があるからおっけーだろ…。ぐらいの意味合いでいいと思います。
— わかめ@TypeScriptカッコガチ (@vvakame) 2014, 6月 12
なお、 @vvakameさんはTypeScriptリファレンス Ver.1.0対応の著者氏です。恐れ多くもありがたいです!
雑感
趣味でGo書くことが多く(というか総量ではGoの方が書いてる)、Goのinterface制約もimplementsキーワードじゃなくてダックタイピング。だけどGoの場合はメソッドの型だけ見てるので、時々こんがらがる。
DRY