如何声明class类型,以确保该对象是常规类的构造函数?

在以下示例中,我想知道应该为AnimalClass赋予哪种类型,以便它可以是PenguinLion:

class Animal {
    constructor() {
        console.log("Animal");
    }
}

class Penguin extends Animal {
    constructor() {
        super();
        console.log("Penguin");
    }
}

class Lion extends Animal {
    constructor() {
        super();
        console.log("Lion");
    }
}

class Zoo {
    AnimalClass: class // AnimalClass could be 'Lion' or 'Penguin'

    constructor(AnimalClass: class) {
        this.AnimalClass = AnimalClass
        let Hector = new AnimalClass();
    }
}

当然,class类型不起作用,无论如何它都太笼统了。

最佳答案

我不确定最初问这个问题时是否可以在TypeScript中实现,但是我的首选解决方案是使用泛型:

class Zoo<T extends Animal> {
    constructor(public readonly AnimalClass: new () => T) {
    }
}

这样,即使在TypeScript智能感知中,变量penguinlion也会推断出具体的类型PenguinLion

const penguinZoo = new Zoo(Penguin);
const penguin = new penguinZoo.AnimalClass(); // `penguin` is of `Penguin` type.

const lionZoo = new Zoo(Lion);
const lion = new lionZoo.AnimalClass(); // `lion` is `Lion` type.

07-27 13:30