2016-08-03 7 views
1

Я нахожусь в начале обучения TypeScript. Я исхожу из строго типизированного языка (C#) и имею некоторые знания в JS.классы и интерфейсы в Typcript

Совсем в начале я упал на следующем примере:

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); 

Теперь я немного запутался. Я бы ожидал чего-то вроде Student:Person (C#) или Student implements Person (Java) Итак: Почему greeter() принимает объект класса "Student"? Я не видел никакой подсказки, что «Student« реализует »Person».

Это просто имена объектов недвижимости? Так что, если добавить еще один класс

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

объект этого класса также будет допустимым параметром для greeter()?

ответ

1

Да вы правы насчет вашего предположения. Вы можете увидеть код, в который вводится машинопись. Код, который Вы отправили (я изменил последнюю строку на предупреждение) выглядит следующим образом

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)); 

После машинописи является transpiled в JavaScript, все, что знание этих интерфейсов и классов теряются. Вы можете видеть это из приведенного выше примера. В этом примере имеет смысл, что он будет работать правильно, потому что входящая переменная person действительно имеет свойства, к которым обращается этот метод. Таким образом, TypScript может видеть, что преобразованная версия вашего кода действительно имеет смысл и не будет жаловаться на это.

1

Да, вы правы, компилятор проверяет, является ли объект, который передается greeter удовлетворяет интерфейс Person, и поскольку Student класса содержит все необходимые свойства, то компилятор доволен.

И да, вы можете сделать это:

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

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

(code in playground)

+0

Хорошо. Было решение 50/50, какой ответ принять. Тем не менее. :) –