typescript 是否可以找到从另一个对象派生的对象的类型?

r7xajy2e  于 2023-01-06  发布在  TypeScript
关注(0)|答案(2)|浏览(97)

我有这样的课程。

export A {...} export B {...} export C {...}

export type data = A | B | C;

然后我有一个这样的数据数组。

dataArr : Array<data> ;

我是否可以使用类似type of的东西来检查dataArr中的元素是否是type ofA?,或者使用其他方法来达到同样的目的?

h7wcgrx3

h7wcgrx31#

typeof只适用于原语,所以这是不可能的。你可以使用类型保护来确定某个对象是AB还是C,但请记住,如果data对象的类型太多,类型保护的复杂性会增加,并且可能会出现问题。
一个简单的类型保护看起来像这样:

interface ImageTypeA {
    data: string
    width: number
    height: number
}

const isImageTypeA = (object: any): object is ImageTypeA => {
    return !!object.data
}

const myImage = {
    data: 'A',
    width: 1,
    height: 1
}

console.log(isImageTypeA(myImage) && myImage.data)

在本例中(这里是playground)你可以看到我是如何故意忽略myImage上的类型的,如果你将鼠标悬停在myImage上,你会看到它没有类型,但是在我的类型保护检查之后,您可以看到它现在确实识别出对象是这个特定的类型。当问题中有多个类型时,您可以在这里进行各种链接,尽管这可能会导致混乱的情况或难以阅读代码,这取决于您如何构建检查。

mspsb9vt

mspsb9vt2#

可以给每个类型增加一个判别属性,然后通过这个属性检查元素的类型,我假设ABC是这样的:

interface A  {
    name: string; 
    age: number;
    kind: "A"
};

interface B  {
    city: string; 
    state: string;
    kind: "B"
};

interface C  {
    address: string;
    kind: "C"

};

这里,kind是一个判别属性,它显示了接口的类型,在switch-case中,你可以得到类型:

type data = A | B | C;
const dataArr: Array<data> = *value that you want to assign*; 

dataArr.forEach(item => {
    switch (item.kind) {
        case 'A':
            //item type is A
            break;
    
        case 'B':
            //item type is B
            break;
            

        case 'C':
            //item type is C
            break;
    }
});

如果ABC为类:

class A  {
    name: string; 
    age: number;
};

class B  {
    city: string; 
    state: string;
};

class C  {
    address: string;
};

您可以使用instanceof关键字:

dataArr.forEach(item => {
    if(item instanceof A){
        //item type is A
    }
    if(item instanceof B){
        //item type is B
    }
    if(item instanceof C){
        //item type is C
    }
});

相关问题