TypeScriptに関する彼のブログ投稿で、MarkRendleは次のように述べています。
「インターフェイスの構造型付け。C#でそれができると本当にいいのですが」
それはどういう意味ですか?
基本的に、これは、インターフェイスがタイプIDベースではなく、「ダックタイピング」ベースで比較されることを意味します。
次のC#コードを検討してください。
interface X1 { string Name { get; } }
interface X2 { string Name { get; } }
// ... later
X1 a = null;
X2 b = a; // Compile error! X1 and X2 are not compatible
そして同等のTypeScriptコード:
interface X1 { name: string; }
interface X2 { name: string; }
var a: X1 = null;
var b: X2 = a; // OK: X1 and X2 have the same members, so they are compatible
仕様ではこれについて詳しく説明していませんが、クラスには「ブランド」があります。つまり、インターフェイスではなくクラスで記述された同じコードにエラーが発生します。C#インターフェイスにはブランドがあるため、暗黙的に変換することはできません。
これについて考える最も簡単な方法は、インターフェイスXからインターフェイスYへの変換を試みている場合、XにYのすべてのメンバーがある場合、XとYの名前が同じでなくても、変換は成功するということです。
について考える。
class Employee { fire: = ..., otherMethod: = ...}
class Missile { fire: = ..., yetMoreMethod: = ...}
interface ICanFire { fire: = ...}
val e = new Employee
val m = new Missile
ICanFire bigGuy = if(util.Random.nextBoolean) e else m
bigGuy.fire
私たちが言ったらどうしますか:
interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...
TypeScriptはこれを許可しますが、C#は許可しません。
TypeScriptは、「緩い」型付けを使用するDOMとうまく連携することを目的としているため、TypeScriptの唯一の賢明な選択です。
「構造型付け」が好きかどうかは読者に任せます…..