gpt4 book ai didi

angular - typescript 类型转换总是返回 "object"

转载 作者:行者123 更新时间:2023-12-02 18:55:53 24 4
gpt4 key购买 nike

假设我有两个接口(interface),它们有两个相同的成员 ID 和名称:

export interface InterfaceA {
id: number;
name: string;
//some other members
}

export interface InterfaceB {
id: number;
name: string;
//some other members
}

我想收集两种类型的元素来填充一些组合框。我需要每个元素的 ID、名称和类型,所以我制作了以下类(class)

export class AssignableDevice {
id: number;
name: string;
type: string;

constructor(device: InterfaceA | InterfaceB) {
this.id = device.id;
this.name = device.name;
this.type = typeof device; //still returns "object"
}
}

// in onInit method :

ngOnInit() {
super.ngOnInit();

this.dataService.getInterfaceA().subscribe((data) => {
data.forEach((element) => this.devices.push(new AssignableDevice(element as InterfaceA)));
});

this.dataService.getInterfaceB().subscribe((data) => {
data.forEach((element) => this.devices.push(new AssignableDevice(element as InterfaceB)));
})
}

但问题是我总是在“AssignableDevice”类构造函数中得到“对象”,我不知道为什么会这样。我可以通过使用一些枚举来实现我的目标,但我想知道为什么这个解决方案不起作用,以及如何实现这一目标。我宁愿不对 InterfaceA 或 InterfaceB 进行任何更改。

最佳答案

您无法在运行时访问对象的 TypeScript 类型(在一般情况下)。 TypeScript 提供了一个编译时类型系统。 typeof您正在使用的是 JavaScript 运行时 typeof ,它总是返回 "object"对于任何类型的对象(以及 null )。

您说过要将类型发送到后端,因此您肯定在运行时需要它。我至少可以看到两种方法:

  1. 您可以将接口(interface)定义为品牌接口(interface),以确保始终包含以下类型:

    export interface InterfaceA {
    id: number;
    name: string;
    //some other members
    type: "InterfaceA"; // <== This is a _string literal type_ whose only valid value is the string "InterfaceA"
    }

    export interface InterfaceB {
    id: number;
    name: string;
    //some other members
    type: "InterfaceB"; // <=== String literal type
    }

    现在,您分配给 InterfaceA 类型的变量、属性或参数的任何对象必须有一个 type带有字符串 "InterfaceA" 的属性和类似的 InterfaceB .然后你的代码将使用那个 type属性(property)。

  2. 您可以将您的构造函数设为私有(private),并且只允许通过 createX 创建接口(interface)方法:

    export class AssignableDevice {
    id: number;
    name: string;
    type: string;

    private constructor(device: InterfaceA | InterfaceB, type: string) {
    this.id = device.id;
    this.name = device.name;
    this.type = type;
    }

    static createA(device: InterfaceA): AssignableDevice {
    return new AssignableDevice(device, "InterfaceA");
    }

    static createB(device: InterfaceB): AssignableDevice {
    return new AssignableDevice(device, "InterfaceB");
    }
    }

    现在你使用合适的createX您拥有的对象类型的方法。由于您在编写代码时做出了该选择,TypeScript 可以进行类型检查以查看您将正确类型的对象传递给 createX。 .

关于angular - typescript 类型转换总是返回 "object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66195926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com