分配条件类型的问题

问题描述 投票:0回答:1

我正在尝试在 TypeScript 中创建条件类型 AnimalLabel

abstract class Animal {
    abstract readonly legCount: number;
}

class Monkey extends Animal {
    legCount: number = 2;
}

class Cow extends Animal {
    legCount: number = 4;
}

class Pirate extends Animal {
    legCount: number = 1;
}

export type AnimalLabel<T extends Animal> =
    T extends Monkey ? 'Monkey label' :
    T extends Pirate ? 'Pirate label' :
    T extends Cow ? 'Cow label' :
    never;

const label: AnimalLabel<Pirate> = 'Pirate label'; // Compiler complains about this line

编译器给出此错误:类型“Pirate label”不能分配给类型“Monkey label”。

我做错了什么?

typescript
1个回答
0
投票

正如评论中所解释的,您无法区分具有相同结构的类型。

如果动物类别的数量变大,则条件类型很难维持。为了避免每个类实例的标签重复,我建议使用静态属性:

游乐场

abstract class Animal {
    abstract readonly legCount: number;
    static readonly label: string;
}

class Monkey extends Animal {
    static readonly label = 'Monkey label';
    legCount: number = 2;
}

class Cow extends Animal {
    static readonly label = 'Cow label';
    legCount: number = 4;
}

class Pirate extends Animal {
    static readonly label = 'Pirate label';
    legCount: number = 1;
}

export type AnimalLabel<T extends typeof Animal> = T['label']

const label: AnimalLabel<typeof Pirate> = 'Pirate label';
© www.soinside.com 2019 - 2024. All rights reserved.