类型转换时的打字稿默认属性

Posted

技术标签:

【中文标题】类型转换时的打字稿默认属性【英文标题】:Typescript default properties when type casting 【发布时间】:2017-08-04 02:33:26 【问题描述】:

有没有办法将对象类型转换为类类型,以便尊重默认属性值?

例如:

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);

这是好的还是坏的做法?

【问题讨论】:

你应该澄清你的问题。你想要一个类的实例还是强制转换一个对象时的类型?例如var p:Person = name="default", ... data 将起作用并强制执行类型,但它不是该类的实例。为此,使用带有初始化程序的类构造函数可能会更好。见:***.com/questions/14142071/… 我想用来自 json 的数据填充类的实例。 【参考方案1】:

为您提供类实例的最简单方法是使用构造函数初始化器并使具有默认值的字段可选:

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;

【讨论】:

谢谢。为什么默认字段必须是可选的? 这意味着您不必在初始化程序中传递它们:例如:new Person(age:20, sex:"male")【参考方案2】:

Type Assertions 无法做到这一点(类型转换);它们在编译时被评估,而Default Values 在运行时被解析。

它们是完全不同的阶段。

【讨论】:

怎么做?有什么方法可以实例化对象,然后在默认值存在之后合并属性? 是的,您可以spread 他们连同您的实例...p, ...overrides。或者,如果您想要默认值:...defaults, ...p。无论哪种方式,您都必须在某个时候使用new 我阅读了关于传播的那一页。我看不出它可以应用于合并对象的任何明显方式。虽然我得到了它与Object.assign(new Person(), p) 一起工作,但不确定用这样的默认属性启动所有对象是否是一个好习惯。 @Guerrilla - 听起来很棒。如果它适合您的需求,您应该将其发布为答案。

以上是关于类型转换时的打字稿默认属性的主要内容,如果未能解决你的问题,请参考以下文章

转换对象属性,以便在打字稿中保留隐式类型

如何在打字稿接口/类型中将枚举值类型转换为数组?

打字稿:将标记的联合转换为联合类型

打字稿:如何将字符串转换为类型

将 JSON 对象转换/翻译为打字稿类型/接口的工具?

打字稿转换 Object.entries 将派生字符串数组减少为文字类型