假定以下类型的类:
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无关。)
答案 0 :(得分:0)
实际上,您的第一个错误是您对执行时间的假设。 Typescript仅提供编译时类型安全,并且不能像其他类型保存语言(如Java或C#)一样工作。这些类型不是强制性的。像HttpClient.get<Person>()
这样的表达式并不强制返回Person实例,它只是声明您假设它将返回符合Person类的对象。只有将反序列化的对象返回,才可以将匿名对象强制转换为Person对象。
因此,除了执行显式代码之外,没有其他方法可以强制执行setter。