2017-03-13 19 views
4

有沒有辦法將對象類型轉換爲類類型,以便尊重默認屬性值?類型轉換時的Typescript默認屬性

例如:

class Person { 
    name: string = "bob"; 
    age: number; 
    sex: string; 
} 

var data = { 
    "age": 23, 
    "sex": "male" 
} 

var p = <Person>data; 

console.log(p.name); // -> undefined 

什麼是做,所以p.name是鮑勃最簡單的方法?

*編輯

這似乎工作:

var record : Person = Object.assign(new Person(), p); 

這是好還是不好的做法?

+0

你應該澄清你的問題。你想要一個類的實例或強制類型轉換時的類型?例如'var p:Person = {name =「default」,... data}'將會工作並執行該類型,但它不是該類的一個實例。爲此,你可能會更喜歡使用初始化器的類構造函數。請參閱:http://stackoverflow.com/questions/14142071/typescript-and-field-initializers/37682352#37682352 –

+0

我想要從json的數據填充類的實例。 – Guerrilla

回答

3

,讓你的類的實例,最簡單的方法是使用一個構造函數初始化器,並用默認值可選使字段:

class Person { 
    name?: string = "bob"; 
    age: number; 
    sex: string; 
    constructor(opt: Person) { 
    Object.assign(this, opt); 
    } 
} 

或者是什麼,是不是可選的初始化明確。

class Person { 
    name: string = "bob"; 
    age: number; 
    sex: string; 
    constructor(opt: { name?: string, age: number; sex: string; }) { 
    Object.assign(this, opt); 
    } 
} 

,或者,如果你不小心被賦予什麼只是讓初始化領域的所有可選:

class Person { 
    name: string = "bob"; 
    age: number; 
    sex: string; 
    constructor(opt?: Partial<Person>) { 
    Object.assign(this, opt); 
    } 
} 

,如果你不關心它是一個類的實例,但要執行領域和類型,然後避免鑄造並明確設置變量的類型,而不是:

var data = { 
    "age": 23, 
    "sex": "male" 
} 

var p1:Person = {name:"bob", ... data}; // or 
var p2:Person = {new Person(), ... data}; 
+0

謝謝。爲什麼必須默認字段是可選的? – Guerrilla

+0

這意味着你不必在初始者中通過它們:例如:'新人({年齡:20,性別:「男性」})' –

+0

啊,非常感謝你 – Guerrilla

1

Type Assertions(類型鑄造)沒有辦法;它們在編譯時進行評估,而在運行時解析Default Values

他們是完全不同的階段。

+0

要做什麼?任何方式來實例化對象,然後合併屬性後的默認值是否存在? – Guerrilla

+0

是的,你可以[傳播](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator)以及你的*實例*:'{... p,.. .overrides}'。或者,如果你想要默認值:'{... defaults,... p}'。無論哪種方式,你都必須使用'new'。 –

+0

我在閱讀傳播頁面。我看不到任何可以應用於合併對象的明顯方式。我用'Object.assign(new Person(),p)'得到了它的工作,但是不確定這是否是一個很好的實踐來啓動所有具有默認屬性的對象。 – Guerrilla