我有一个将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
}
答案 0 :(得分:2)
类型转换仅转换类型。 Typescript在运行时不存在。因此,如果JSON.parse
没有返回正确的Test
实例(由于方法不会被序列化,则不会返回),它将在运行时失败。您可能不希望进行类型转换,而是要构建一个Test实例,然后将序列化的数据加载到其中。
答案 1 :(得分:1)
TypeScript“投射”(<A>tmp
或tmp as A
):
any
,则不可用。当数据来自不安全/外部来源时,例如JSON.parse()或WebAPI调用,它是DTO (数据传输对象),类型为any
。 TypeScript“ cast”也是不安全的。
为确保强制转换操作,可以使用从DTO到“域模型”类的映射功能。关键是返回一个真实的类实例。
Object.assign(new IntervalRange(), this.range)
(您在评论中提到)满足了这一点。this.a = range.a; this.b = range.b; ...)
可以使我们更加严格。这两个选项最好都包含在一个函数中:类构造函数,类中的静态工厂方法,同一模块中的外部函数。