2016-03-22 18 views
3

我剛開始學習打字稿。有一個問題,我需要你的幫助。打字稿人界面學生班關係

在下面的代碼片段中,爲什麼簽名不匹配時沒有編譯器錯誤?這個人的學生在這裏有什麼關係?

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

感謝, Gourav

回答

2

爲什麼沒有用於簽名不匹配沒有編譯器錯誤?

由於Javascript的動態性很強,TypeScript對鴨子打字非常寬容。您的greeter函數接受Person,但它實際上等效於具有firstname: stringlastname: string屬性的對象。

對於編譯器來說,給定對象是指定類的實際實例,指定接口的實現還是僅具有相同屬性的對象字面值並不重要。

以下是greeter函數的所有有效用途。對象文本作爲參數直接傳遞:

greeter({ 
    firstname: "John", 
    lastname: "White" 
}); 

接口類型的變量初始化對象文本,然後作爲參數傳遞:

var somebody: Person; 

somebody = { 
    firstname: "John", 
    lastname: "White" 
}; 

greeter(somebody); 

至於Student和爲什麼它接受:與public關鍵字在構造函數中,您會自動初始化對象實例的相應屬性。它實際上是一個速記:

class Student { 
    fullname : string; 

    public firstname: string; 
    public middleinitial: string; 
    public lastname: string; 

    constructor(firstname: string, middleinitial: string, lastname: string) { 
     this.firstname = firstname; 
     this.middleinitial = middleinitial; 
     this.lastname = lastname; 
    } 
} 

而且由於學生類現在有一個名字和一個姓氏屬性,它們都是字符串,學生類滿足Person接口的要求。明確指定Student implements Person可能是一個好主意。

0

class Student { 
    fullname : string; 
    constructor(public firstname, public middleinitial, public lastname) { 
    ..// 

類似於 「後」

class Student { 

     fullname : string; 

     public firstname  ....// 
     public middleinitial ....// 
     public lastname  ....// 

     constructor(public firstname, public middleinitial, public lastname) 

當你

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

user推斷類型在這種情況下string

class Student { 

     fullname : string; 

     public firstname  : string ....// 
     public middleinitial : string ....// 
     public lastname  : string ....// 

和你interfarce:

interface Person { 
    firstname: string; 
    lastname: string; 
} 

當你說:

function greeter(person : Person) 

你必須通過符合接口要求的最低水平。

現在你做一些像greeter(user);用戶它有額外的信息,所以它的工作原理。


class Student {         | interface Person { 
               | 
     fullname : string;      | 
               | 
     public firstname  : string = "Jane"; -> firstname: string; 
     public middleinitial : string = "M."; | 
     public lastname  : string = "User"; -> lastname: string; 
               | 
               | }