将对象转换为特定类型时,不会调用目标类型的对象设置器

时间:2019-12-09 08:08:25

标签: typescript

假定以下类型的类:

class Person {
  private _firstName: string;

  get FirstName(): string { return this._firstName; }
  set FirstName(firstName: string) { this._firstName = firstName; }
}

调用HttpClient.get<Person>()后,它返回类型为Person的对象,但不调用该对象属性的设置方法。

示例显示强制转换不调用setter但正常对象创建可以调用setter的问题: https://jsfiddle.net/r175sLkh/

其背后的原因似乎是这样的事实:从JSON字符串转换后,会生成一个匿名对象,然后将其强制转换为所需的对象。当属性有一个setter时,它将被JSON对象中的简单类型覆盖。

由于名称相同,原始Person.FirstName()将被(anonymous).FirstName覆盖。

因此,要使我的二传手真正发挥作用,我必须遍历HttpClient.get<Person>()的结果,并将其逐个属性手动分配给新创建的Person对象……

所以我现在的问题...

是否有一种更好的方法,以确保在强制转换为所需对象时会遵循设置方法,而不是手动转换/分配它们? (此问题通常与TypeScript中的getter / setter无关。)

1 个答案:

答案 0 :(得分:0)

实际上,您的第一个错误是您对执行时间的假设。 Typescript仅提供编译时类型安全,并且不能像其他类型保存语言(如Java或C#)一样工作。这些类型不是强制性的。像HttpClient.get<Person>()这样的表达式并不强制返回Person实例,它只是声明您假设它将返回符合Person类的对象。只有将反序列化的对象返回,才可以将匿名对象强制转换为Person对象。

因此,除了执行显式代码之外,没有其他方法可以强制执行setter。