2017-03-13 21 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