2017-02-16 133 views
0

假設我有以下類:演員對象的一些類,並稱類函數對象

class Person { 

    name: string; 
    age: number; 
    country: string; 

    canVote(): boolean { 
     return (this.country === "SomeCountry" && this.age >= 16) || (this.country === "SomeOtherCountry" && this.age >= 18); 
    } 

} 

是否有打字稿任何方式投含有nameagecountry屬性是一個對象一個Person類的實例,我可以打電話canVote,就像這樣? (現在,這並不編譯,因爲canVote丟失)

let person: Person = { 
    name: "SomePerson", 
    age: 42, 
    country: "SomeCountry" 
} 

console.log(person.canVote()); 

我知道有參數特性,這將讓我做到以下幾點:

class Person { 

    constructor(readonly name: string, readonly age: number, readonly country: string) { 
    } 

    canVote(): boolean { 
     return (this.country === "SomeCountry" && this.age >= 16) || (this.country === "SomeOtherCountry" && this.age >= 18); 
    } 

} 

let person = new Person("SomePerson", 42, "SomeCountry"); 

不過,我想這會得到不清楚如果屬性數量增加,或者我想讓一個可選屬性未設置,那麼速度相當快。

回答

0

您可以使用構造函數的接口並在構造函數中使用它。這樣它將始終保持建築清潔,並且如果您願意,可以在以後輕鬆擴展屬性。

interface ICharacter { 
    name: string; 
    age: number; 
    country: string; 
} 

class Person { 
    character: ICharacter; 

    constructor(character: ICharacter) { 
     this.character = character; 
    } 

    canVote(): boolean { 
     return (this.character.country === "SomeCountry" && this.character.age >= 16) 
      || (this.character.country === "SomeOtherCountry" && this.character.age >= 18); 
    } 
} 

let character: ICharacter = { 
    name: "SomePerson", 
    age: 42, 
    country: "SomeCountry" 
}; 

let person: Person = new Person(character); 
console.log(person.canVote());