打字稿中的类构造函数类型?

新手上路,请多包涵

如何声明 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 类型不起作用,反正也太笼统了。

原文由 arthur.sw 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 430
2 个回答

当最初提出问题时,我不确定这在 TypeScript 中是否可行,但我首选的解决方案是使用 _泛型_:

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

这种方式变量 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.

原文由 Nenad 发布,翻译遵循 CC BY-SA 4.0 许可协议

如何声明一个类类型,以确保对象是通用类的构造函数?

构造函数类型可以定义为:

  type AConstructorTypeOf<T> = new (...args:any[]) => T;

 class A { ... }

 function factory(Ctor: AConstructorTypeOf<A>){
   return new Ctor();
 }

const aInstance = factory(A);

原文由 AleC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进