类型转换

时间:2017-03-13 22:16:25

标签: 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是bob?

*修改

这似乎有效:

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

这是好事还是坏事?

2 个答案:

答案 0 :(得分: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};

答案 1 :(得分:1)

使用Type Assertions(类型转换)无法执行此操作;它们在编译时被评估,而Default Values在运行时被解析。

他们是完全不同的阶段。