javascript 根据类变量中另一个属性的值更改对象属性的类型

hts6caw3  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(114)

TL;使用联合类型时,DR TypeScript类型推理在类中失败

我在处理类和联合类型时遇到了一个typescript问题。
这是我得到的类型的基本版本:

type CommonData = {
    name: string
}

type Dog = {
    age: number
} & CommonData

type Bat = {
    wingspan: number
} & CommonData

type Animal = {
    type: "dog"
    data: Dog
} | {
    type: "bat"
    data: Bat
}

Animal类型根据type字段的值更改其数据类型。
因此,当使用Animal类型创建对象时,typescript能够根据type字段确定每种动物使用的数据类型。

const bat: Animal = {
    type: "bat",
    data: {
        name: "tim",
        wingspan: 9000
    }
}

// has type inference, 
bat.data.name

但是,当在类中实现相同类型时,typescript无法识别返回的数据类型,下面是我当前代码的一个示例:

class AnimalClass {
    animal: Animal

    constructor (animal: Animal) {
        this.animal = animal
    }
}

const dog = new AnimalClass({
    type: "dog",
    data: {
        name: "bob",
        age: 10
    }
})

// no type inference on data, typescript doesn't know that it's a Dog
dog.animal.data

dog.animal.data 的类型为Dog | Bat。是否可以更改代码以推断dog.animal.data的类型为Dog
提前感谢:)
下面是完整的代码:打字机Playground

ee7vknir

ee7vknir1#

您可以在Animal类上使用泛型注解,如下所示,以完成推理:

class AnimalClass<T extends Animal> {
    animal: T;

    constructor (animal: T) {
        this.animal = animal
    }
}

Playground

相关问题