18

TypeScriptに関する彼のブログ投稿で、MarkRendleは次のように述べています。

「インターフェイスの構造型付け。C#でそれができると本当にいいのですが」

それはどういう意味ですか?

4

2 に答える 2

20

基本的に、これは、インターフェイスがタイプ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の名前が同じでなくても、変換は成功するということです。

于 2012-10-04T05:29:34.923 に答える
2

について考える。

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の唯一の賢明な選択です。

「構造型付け」が好きかどうかは読者に任せます…..

于 2014-02-12T15:40:18.053 に答える