2016-08-03 13 views
1

Ich bin am Anfang des Lernens TypeScript. Ich komme aus einer stark typisierten Sprache (C#) und habe etwas Wissen in JS.Klassen und Schnittstellen in Typescript

am Anfang ziemlich fiel ich über das folgende Beispiel:

class Student { 
    fullName: string; 
    constructor(public firstName, public middleInitial, public lastName) { 
     this.fullName = firstName + " " + middleInitial + " " + lastName; 
    } 
} 

interface Person { 
    firstName: string; 
    lastName: string; 
} 

function greeter(person : Person) { 
    return "Hello, " + person.firstName + " " + person.lastName; 
} 

var user = new Student("Jane", "M.", "User"); 

document.body.innerHTML = greeter(user); 

Jetzt habe ich ein wenig verwirrt bin. Ich würde etwas wie Student:Person (C#) oder Student implements Person (Java) erwarten Also: Warum akzeptiert greeter() ein Objekt der Klasse "Student"? Ich habe keine Ahnung gesehen, dass "Student" "Person" implementiert.

ist es nur über die Namen der Eigenschaften? Also, wenn ich eine andere Klasse

class Teacher { 
    salaray:int, 
    firstName:string, 
    lastName:string 
} 

ein Objekt dieser Klasse auch hinzufügen, ein gültiger Parameter für greeter() sein würde?

Antwort

1

Ja, Sie über Ihre Annahme richtig sind. Sie können den Code sehen, in den das Typoskript transpiliert. Der Code, den Sie auf dem Laufenden (änderte ich die letzte Zeile auf eine Warnung) sieht wie folgt aus

var Student = (function() { 
    function Student(firstName, middleInitial, lastName) { 
     this.firstName = firstName; 
     this.middleInitial = middleInitial; 
     this.lastName = lastName; 
     this.fullName = firstName + " " + middleInitial + " " + lastName; 
    } 
    return Student; 
}()); 

function greeter(person) { 
    return "Hello, " + person.firstName + " " + person.lastName; 
} 

var user = new Student("Jane", "M.", "User"); 
alert(greeter(user)); 

Sobald das Typoskript Javascript transpiled ist, all das Wissen über diese Schnittstellen und Klassen verloren. Sie können das aus dem obigen Beispiel sehen. In diesem Beispiel ist es sinnvoll, dass es ordnungsgemäß ausgeführt wird, da die eingehende Variable tatsächlich über die Eigenschaften verfügt, auf die die Methode zugreift. So kann Typescript sehen, dass die transpilierte Version Ihres Codes tatsächlich sinnvoll ist und sich nicht darüber beschweren wird.

1

Ja, Sie haben richtig, werden die Compiler überprüft, ob das Objekt, das zu greeter erfüllt die Person Schnittstelle übergeben wird, und da die Student Klasse alle benötigten Eigenschaften enthält dann der Compiler ist glücklich darüber.

Und ja, Sie können dies tun:

class Teacher { 
    salaray: number; 
    firstName:string; 
    lastName:string; 
} 

document.body.innerHTML = greeter(new Teacher()); 

(code in playground)

+0

Ok. Es war eine 50/50 Entscheidung, welche Antwort zu akzeptieren. Trotzdem. :) –

Verwandte Themen