2012-10-04 105 views
17

在約打字稿他blog post,馬克Rendle是說,是的,他很喜歡它的原因之一是:什麼是「對接口的結構打字」的打字稿

「的界面結構打字我真的希望C#可以做到這一點「

他是什麼意思?

+0

我簡要閱讀本http://stackoverflow.com/questions/2831175/does-c-sharp-有一個相當於scalas結構鍵入它澄清了一點,但仍然想知道它如何在TypeScript中使用 –

回答

18

基本上,這意味着界面在「鴨子打字」的基礎上進行比較,而不是基於類型識別的基礎。

考慮下面的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 

以及等效打字稿代碼:

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可能不一樣名。

1

想一想。

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: = ...} 
... 

打字稿將允許這一點,C#不會。

由於TypeScript旨在與使用「寬鬆」打字的DOM良好協作,因此它是打字稿唯一明智的選擇。

我把它留給讀者來決定他們是否喜歡「結構性輸入」 ... ..