【问题标题】:Cast recieved data from service to the correct model将接收到的数据从服务转换到正确的模型
【发布时间】:2016-01-27 14:42:35
【问题描述】:

您好,我有以下型号:

export class Vehicle {
}

export class Trike extends Vehicle {
}

export class Car extends Vehicle {
}

这些是从 API 的 Mock 中检索到的

 var vehiclesResource = vehicleService.getResource();
        vehiclesResource.query((data) => {
            this.areas = data;

            var c = data[0] instanceof Car;
            var t = data[0] instanceof Trike;

            var cc = data[0].constructor === Car;
            var tt = data[0].constructor === Trike;
        });

从 API 检索汽车,现在当数据到达时,我想将其转换为正确的对象(在本例中为汽车)。但有些如何 c = false t = false cc = false 和 tt = false。

在visualstudio中设置断点显示数据是对象(资源)类型

我做错了什么?

【问题讨论】:

    标签: angularjs inheritance model typescript


    【解决方案1】:

    很可能是您通过反序列化接收数据。在这种情况下,即使对象的结构相同,对象的类型也会丢失。例如,如果您执行以下操作:

    let a = new Car();
    let data = JSON.stringify();
    let aa = JSON.parse(data);
    

    'aa' 对象的类型将是 'Object' 而不是 'Car'。 如果可以接受,您可以将类定义转换为接口定义,然后像这样使用它:

    let aa = <Car>JSON.parse(data);
    

    或者你可以实现自己的反序列化方法,更多信息在这里:How do I initialize a typescript object with a JSON object

    【讨论】:

    • 好吧,假设我创建了一个接口 IVehicle,然后在我的 api 上发出请求。 api 可以给我一辆三轮车或一辆汽车,但我不知道它在接收端是哪一个。我如何从数据中获取正确的对象类型,因为数据可以是 IVehicle 数组,可以是 Car 或 Trike。
    • 是的。在这种情况下,您必须采用我提到的第二种方法。
    • 好的,我知道我需要更仔细地阅读此内容。不幸的是,您似乎需要向对象添加一个属性“名称”等才能使其工作。我希望有类似 dynamic_cast 之类的东西可以在 c++ 中使用。
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多