2017-09-03 52 views
5

比方說,我有一個非常簡單的類與計算性能:速記字段初始上課時已經計算財產

class Person { 
    firstName: string; 
    lastName: string; 

    get fuillName(): string { 
    return this.firstName + ' ' + this.lastName; 
    } 
} 

現在我想創建Person類型的對象:

let p: Person = { 
    firstName: 'John', 
    lastName: 'Smith' 
}; 

這給我一個錯誤:

Type '{ firstName: string; lastName: string; }' is not assignable to type 'Person'. Property 'fuillName' is missing in type '{ firstName: string; lastName: string; }'.

咦? fullName是隻讀屬性。所以我跟着this question並實現了部分初始化器:

constructor(init?: Partial<Person>) { 
    Object.assign(this, init); 
} 

同樣的錯誤。我知道我可以做到這一點:

let p = new Person(); 
p.firstName = 'John'; 
p.lastName = 'Smith'; 
console.debug(p.fullName); 

但是有沒有簡短的手段來初始化類使用JSON語法?

+0

」同樣的錯誤。「 - 你真的更新了你的初始化器來調用構造器,就像你從節目中得到的答案一樣嗎? – hvd

+1

好的,您接受@ Vega的答案的事實表明您確實沒有做到您正在閱讀的答案已經顯示。 – hvd

回答

3

如果你定義Person類如下:

class Person { 
    firstName?: string; 
    lastName?: string; 

    constructor(values: Object = {}) { 
     Object.assign(this, values); 
    } 

    get fullName(): string { 
     return this.firstName + ' ' + this.lastName; 
    } 
    } 

,你可以初始化一個新的用戶,如下所示:

let p = new Person({firstName : 'John', lastName: 'Smith'}); //one line, two assignations 
    console.log(p.fullName); 

再進一步:

class Person { 
    ....// as above 
    set fullName(fullName: string){ 
     let splitName = fullName.split(" "); 
     this.firstName = splitName[0] || ''; 
     this.lastName = splitName[1] || ''; 
    } 
    } 

    let p = new Person() 
    p.fullName = "Paul Doe"; 

Plunker Demo

+0

這將'fullName'改爲一個函數,但這是一個好的折中,我猜 –

+0

請看我的更新 – Vega

+0

任何你把OP的'Partial '更改爲'Object'的原因?這似乎只是介紹了做錯事情的可能性,這意味着當你遇到任何問題時你都不會得到任何提示。意外地輸入'fristName'而不是'firstName'。 – hvd