2016-03-22 6 views
3

私はちょうどTypeScriptの学習を始めました。あなたの助けが必要な質問があります。Typescriptの人のインターフェイスの学生クラスの関係

以下のスニペットでは、署名ミスマッチのコンパイルエラーが発生しないのはなぜですか?学生&はどのようにここに関連していますか?

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機能の有効な使用方法です。リテラルは直接引数として渡されたオブジェクト:

var somebody: Person; 

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

greeter(somebody); 

Studentについては

、なぜそれが受け入れられています:publicキーワードで

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

Interfaceは、オブジェクトリテラルで初期化し、その後、引数として渡された変数の型指定されましたコンストラクタでは、オブジェクトインスタンスの対応するプロパティを自動的に初期化します。これは、速記に効果的である:

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

と学生クラスは今、姓と名のプロパティを持っており、彼らは両方の文字列であるため、Studentクラスは、人・インタフェースの要件を満たしています。 Student implements Personを明示的に指定することをお勧めします。

0

この

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

あなたは

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

user、この場合string

内の型を推論作るとき

class Student { 

     fullname : string; 

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

     constructor(public firstname, public middleinitial, public lastname) 

"後" に似です3210

とあなたの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; 
               | 
               | } 
関連する問題