打字稿:在接口中使用枚举值

时间:2019-07-18 11:43:41

标签: typescript

我有一个在其字段之一中使用枚举值的接口:

export enum AnimalType {
    DOG,
    CAT,
}


export interface DogAttrs {
    bones: boolean,
    type: AnimalType.DOG
}

我的目标是创建狗并将其添加到狗列表的功能。

function addDog(animalList: DogAttrs[]) {
    const animal = {
        type: AnimalType.DOG,
        bones: true
    }
    animalList.push(animal);   
}

但是此函数表示我创建的对象是错误的,并且不符合DogAttrs接口:

Type 'AnimalType' is not assignable to type '"DOG"'.

那是为什么?以及如何解决这个问题?

实时示例:

https://www.typescriptlang.org/play/#code/FAUwHgDg9gTgLgAhAOwK4FsEEFkEt0CGANgCoCeEICA3sAvQgCIDyA4ggLwIDkLr3AGjoMAwlhKceYkoOABfYIvDR4CXMjggYAMwIBjKoygBzLHDgwAzjWH0ARlGQhLALgQOoREAWRCGCOAoQN142bnlFRW1UZD04XEcEAgATZKNjAAoffGIAGVxLODd0swtLAG0AXQBKG389R0KkvEIiSVp-f0DKNxwc0iCAOj4-TvtHZzcLVBBbBAV-bNb8wsGIVEsACyyW4mqAbgYIyOAgA

1 个答案:

答案 0 :(得分:2)

问题在于,当您将打字稿分配给变量时,打字稿会扩大常量的类型。一种简单的解决方案是使用as const断言或显式指定常量的类型:

function addDog(animalList: DogAttrs[]) {
    const animal: DogAttrs = {
        type: AnimalType.DOG,
        bones: true
    }
    animalList.push(animal);   
}

function addDog(animalList: DogAttrs[]) {
    const animal = {
        type: AnimalType.DOG,
        bones: true
    } as const
    animalList.push(animal);   
}