2012-10-04 13 views
17

In seinem blog post über Typoskript, Mark Rendle ist zu sagen, dass eines der Dinge, die er über sie gefällt ist.Was „Structural Typing für Schnittstellen“ in Typoskript

„Strukturelle Typisierung für Schnittstellen ich wirklich wollen C# könnte das tun "

Was meinte er damit?

+0

Ich habe dies kurz lesen http://stackoverflow.com/questions/2831175/does-c-sharp- have-an-equivalent-to-scalas-structural-typing, das es ein wenig verdeutlicht, aber immer noch gerne wissen möchte, wie es in TypeScript verwendet wird –

Antwort

18

Grundsätzlich bedeutet dies, dass Schnittstellen auf der Basis einer "Entschlüsselung" und nicht auf Basis einer Typidentität verglichen werden.

Betrachten Sie das folgende C# -Code:

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 

Und das Äquivalent Typoskript Code:

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 

Die Spezifikation dies nicht in viel Detail abdecken, aber Klassen "Marken", was bedeutet, die Derselbe Code, geschrieben mit Klassen anstelle von Schnittstellen, würde haben einen Fehler. C# -Schnittstellen haben Marken und können daher nicht implizit konvertiert werden. Der einfachste Weg, darüber nachzudenken, ist, dass, wenn Sie eine Konvertierung von Schnittstelle X zu Schnittstelle Y versuchen, wenn X alle Mitglieder von Y hat, die Konvertierung erfolgreich ist, obwohl X und Y möglicherweise nicht das Gleiche haben Namen.

1

Denken Sie darüber nach.

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 

Was passiert, wenn wir gesagt:

interface IButtonEvent { fire: = ...} 
interface IMouseButtonEvent { fire: = ...} 
... 

Typoskript dies ermöglichen wird, # C nicht.

Da TypeScript darauf abzielt, gut mit dem DOM zu arbeiten, das "lose" Typisierung verwendet, ist es die einzig sinnvolle Wahl für Typoskript.

ich es verlassen, um den Leser zu entscheiden, ob sie „Structural typing“ mögen ... ..