使用类型定义Typescript在redux中获取WriteableDraft错误

djmepvbi  于 2023-10-19  发布在  TypeScript
关注(0)|答案(2)|浏览(135)

我有一个类型错误,我不明白
这是国家的类型

export type Foo = {
    animals: {
        dogs?: Dogs[],
        cats?: Cats[],
        fishs?: Fishs[]
    },
    animalQueue: (Dogs | Cats | Fishs)[]
}

现在,在一个减速器里,

...
someFunction: (state, action: PayloadAction<{ index: number, animalKey: keyof Required<Foo>['animals']}> => {
    const {index, animalKey} = action.payload
    const animal = state.animalQueue[index]
    state.animals[animalKey]!.push(animal)
}
...

这给了我一个错误
TS 2345:类型为“”的参数|可调吃水|不能为类型“狗、猫和鱼”的参数赋值<...>。类型'可分配草稿'不能分配给类型'狗&猫&鱼'。类型“CatableDraft”中缺少属性“height”,但类型“Cats”中需要该属性。
我猜是因为这个

(Dogs | Cats | Fishs)[]

所以我在这里尝试定义的是一个可以包含Dogs和/或Cats和/或Fishs的Array。所以基本上所有的东西都是“混合”的。

xggvc2p6

xggvc2p61#

你不知道的错误是由于Type脚本的类型检查以及它如何与你为Foo状态找到的类型相关联。这是rеlatеd的事实,类型脚本是试图确保类型匹配正确的时候,你推到动物数组的基础上动物。
此错误模式表示Typescript正在扩展某些属性(如Cats的“hight”),而这些属性在您正在使用的Draft类型中没有出现。
以下是更新后的reducer函数:

someFunction: (state, action: PayloadAction<{ index: number, animalKey: keyof Required<Foo>['animals'] }>) => {
    const { index, animalKey } = action.payload;
    const animal = state.animalQueue[index];

    if (animalKey === 'dogs') {
        state.animals.dogs!.push(animal as Dogs);
    } else if (animalKey === 'cats') {
        state.animals.cats!.push(animal as Cats);
    } else if (animalKey === 'fishs') {
        state.animals.fishs!.push(animal as Fishs);
    }
}
i86rm4rw

i86rm4rw2#

需要进行严格的类型检查

someFunction: (state, action: PayloadAction<{ index: number, animalKey: keyof Required<Foo>['animals'] }>) => {
    const { index, animalKey } = action.payload;
    const animal = state.animalQueue[index];
    switch (animalKey):
        case 'dogs':
            if(isDogType(animal)) state.animals[animalKey]!.push(animal as Dogs);
            break;
        case 'cats':
            if(isCatType(animal)) state.animals[animalKey]!.push(animal as Cats);
            break;
        case 'fishs':
            if(isFishType(animal)) state.animals[animalKey]!.push(animal as Fishs);
            break;
}

其中isDogType()isCatType()isFishType()type guards

相关问题