2017-02-16 2 views
0

Пусть у меня есть следующий класс:Cast объект некоторого класса, добавляя функцию этого класса объекта

class Person { 

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

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

} 

Есть ли способ в машинописи, чтобы бросить объект, содержащий name, age и country атрибутов быть экземпляр класса 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"); 

Однако, я думаю, это было бы получить неясными довольно быстро, если количество свойств увеличивается или я хочу оставить необязательное свойство unset.

ответ

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()); 
Смежные вопросы