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

时间:2019-02-12 18:52:33

标签: javascript typescript casting type-conversion

我有一个将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
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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; ...)可以使我们更加严格。

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