我正在尝试在 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”。
我做错了什么?
正如评论中所解释的,您无法区分具有相同结构的类型。
如果动物类别的数量变大,则条件类型很难维持。为了避免每个类实例的标签重复,我建议使用静态属性:
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';