I sin bloggpost om maskinskrevet manuskript, er Mark Rendle sa at en av de tingene han liker om det er:
Strukturelle skrive for grensesnitt. Jeg skulle ønske C # kunne gjøre det
Hva mente han med det?
I sin bloggpost om maskinskrevet manuskript, er Mark Rendle sa at en av de tingene han liker om det er:
Strukturelle skrive for grensesnitt. Jeg skulle ønske C # kunne gjøre det
Hva mente han med det?
I utgangspunktet betyr det at grensesnittene er sammenlignet på en "duck skrive" basis i stedet for på en type identitet basis.
Vurder følgende C # -kode:
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
Og tilsvarende Loggfila kode:
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
Spesifikasjonen dekker ikke dette i mye detalj, men klasser har "merkevarer" som betyr den samme koden, skrevet med klasser i stedet for grensesnitt, ville ha en feil. C # grensesnitt har merker, og dermed ikke kan implisitt konverteres.
Den enkleste måten å tenke på det er at hvis du forsøker en konvertering fra grensesnitt X til grensesnitt Y, hvis X har alle medlemmer av Y, konverteringen lykkes, selv om X og Y ikke kan ha samme navn.
Tenk om.
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
Hva om vi sa:
interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...
Loggfila vil tillate dette, vil C # ikke.
Som Loggfila som mål å fungere godt med DOM som bruker “løs” å skrive, er det eneste fornuftige å velge for typescript.
Jeg lar det være opp til leseren å avgjøre om de liker “Structural skrive” ... ..