繁体   English   中英

将对象类型转换为另一种类型

[英]Cast object type to another type

我有一个将range类型设置为IntervalRange

export class Test {range: IntervalRange;}

然后在父类中,我初始化值:

export class TestInitializer {
Create(){
    return <Test>{
        range: IntervalRange.initialize(Database.GetByName('MONTH').id};
}

InitializeElement() {
  let test = <Test>JSON.parse(JSON.stringify(configuration));
  return test;
}

然后在其他组件中,我将其用作:

@Input() range: IntervalRange;

但是在函数range.getRange(); 我得到: ERROR TypeError: this.range.getRange is not a function

这是为什么? 它说range是一个对象,尽管应该是IntervalRange

我尝试编写as IntervalRange<IntervalRange> range无效。 如何解决?

更新: let type = typeof(this.range) ; 打印"object"

方法:

ngOnChanges() {
if (this.range) {
  let type = typeof(this.range);
  let ddd = this.range.getRange(); //<----- this is where I get error
}

类型转换仅强制转换类型。 Typescript在运行时不存在。 因此,如果JSON.parse没有返回正确的Test实例(由于方法不会序列化,则不会返回),它将在运行时失败。 您可能不希望进行类型转换,而是要构建一个Test实例,然后将序列化的数据加载到其中。

TypeScript“广播”( <A>tmptmp as A ):

  • 进行结构类型兼容性检查→如果源数据的类型为any则不可用。
  • 没有运行时对应项→TypeScript类型可以兼容,但运行时类型可以不同,例如,对象文字与真实类实例。

当数据来自不安全/外部来源(例如JSON.parse()或WebAPI调用)时,它是DTO (数据传输对象) ,具有any类型。 TypeScript“ cast”也是不安全的。

为了确保强制转换操作,可以使用从DTO到“域模型”类的映射功能。 关键是返回真实的类实例。

  • Object.assign(new IntervalRange(), this.range) (您在注释中提到的)满足了这一点。
  • 使用“逐字段映射”可以使我们更加严格: this.a = range.a; this.b = range.b; ...) this.a = range.a; this.b = range.b; ...) this.a = range.a; this.b = range.b; ...)

这两个选项最好都包含在函数中:类构造函数,类中的静态工厂方法,同一模块中的外部函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM