【问题标题】:Object setter of the target type is not called when casting an object into the specific type将对象转换为特定类型时不调用目标类型的对象设置器
【发布时间】:2019-12-09 08:08:25
【问题描述】:

假设有以下类型的类:

class Person {
  private _firstName: string;

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

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

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

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

原来的Person.FirstName() 会因为同名而被(anonymous).FirstName 覆盖。

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

所以我现在的问题......

除了手动转换/分配它们之外,是否有一种更好的方法来确保在投射到所需对象时尊重 setter? (这个问题通常与 TypeScript 中的 getter/setter 无关。)

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    因此,鉴于没有办法强制执行 setter,除了执行它的显式代码。

    【讨论】:

    • 这是一个很好的观点。完全忽略了它只是“对象”之上的“层”这一事实。我想知道我是否可以制作一个自己的演员来真正转换一个对象。
    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 2021-07-21
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2023-01-05
    相关资源
    最近更新 更多