2015-12-10 46 views
2

我正在用TypeScript構建一些最佳實踐。如果我提出一個Web請求,並且我得到一個帶有屬性NameAge的JSON對象,是否有一種簡單的方法可以將它轉換爲我的類,該類具有屬性NameAge以及函數說PrintPerson將香草物體轉換爲類?

我知道我可以寫出一個構造函數,它將對象和字段按字段複製到this中,以便類具有相同的數據。這裏有一個簡單的例子:

interface RawPerson { 
    Name: string; 
    Age: number; 
} 

class Person implements RawPerson { 
    Name: string; 
    Age: number; 

    constructor(obj: RawPerson) { 
     this.Name = obj.Name; 
     this.Age = obj.Age; 
    } 

    PrintPerson() { 
     console.log(this.Name + ' is ' + this.Age); 
    } 
} 

var json = { Name: 'Corey', Age: 26 }; 
// What works 
new Person(json).PrintPerson(); 
// Something simple I'd like to do (but doesn't work) 
// If this worked, I wouldn't need the Person constructor 
(<Person>json).PrintPerson(); 

TypeScript Playground

有一個構造函數拷貝過來每場可以得到乏味。我想做一些簡單的事情,就像投它一樣,只是希望這些功能現在已經神奇了。他們不是。有沒有其他辦法可以讓我免於寫這個笨拙的構造函數?

+0

難道你不應該能夠施放它嗎? IE:'ajaxCall.then((data:Person)=> {//數據現在是Person類型' – tymeJV

+0

@tymeJV我正在使用Angular 2,所以'http.get'中的內容是一個'Response'對象。如果我有'res:Response',那麼我可以調用'res.json()'來獲得它作爲一個vanilla對象。如果我把它轉換成'Person',那麼(就像我上面的例子),我得到一個錯誤, 'PrintPerson'不存在 –

+0

它看起來像試圖' res.json()'仍然只看到對象作爲一個對象而不是一個人。沒有轉換髮生,因此爲什麼'PrintPerson' isn'對它,它仍然是一個對象。 –

回答

7

怎麼樣使用Object.assign

interface Object {  
    assign(target: any, ...sources: any[]): any; 
} 

interface RawPerson { 
    Name: string; 
    Age: number; 
} 

class Person implements RawPerson { 
    Name: string; 
    Age: number; 

    constructor(obj: RawPerson) { 
     Object.assign(this, obj); 
    } 

    PrintPerson() { 
     console.log(this.Name + ' is ' + this.Age); 
    } 
} 

var json = { Name: 'Corey', Age: 26 }; 
new Person(json).PrintPerson(); // prints: "Corey is 26" 
+1

我同意這一點 – basarat