如何将一个类注入另一个类以用作es6类中的构造函数

问题描述

我有一个我想使用的模块称为Pigpio,该模块导出一个名为Gpio的类

enter image description here

我想将此类作为依赖项注入另一个类中,以便可以使用它来构建GPIO实例:

// a simplified example of the class

import { Gpio } from "pigpio";

class PinManager {

    gpioBuilder: Gpio
    construct(builder: Gpio){
        this.gpioBuilder = builder
    }

    buildNewGpioPin(pinNumber: number,direction: number){
        return new this.gpioBuilder(pinNumber,direction)
    }
}

export default PinManager

问题是,当我尝试调用this.gpioBuilder来构造Gpio类的新实例时,出现一条错误消息,告诉我属性中没有该类的构造函数

enter image description here

我敢肯定,这是因为es6类只是javascript原型继承模式的语法糖,但我不确定该如何解决

我想将Gpio作为依赖项进行注入,以便在测试中更容易进行模拟,但是如果我不能以这种方式进行依赖项注入,则我不确定如何做到。

更新发布的正确答案

在Alex给出的示例之后,我能够更正我的课程并消除错误

import { Gpio } from "pigpio"

class PinManager {
    gpioBuilder: typeof Gpio
    construct(builder: typeof Gpio) {
        this.gpioBuilder = builder
    }

    buildNewGpioPin(pinNumber: number,direction: number) {
        return new this.gpioBuilder(pinNumber,{ mode: direction })
    }
}

export default PinManager

我还翻阅了打字稿手册,以解释它为什么有效(我一直在阅读该手册,但没有看到它,事实证明我还没到那一部分):

https://www.typescriptlang.org/docs/handbook/classes.html#constructor-functions

重要的部分是:

...在这里,我们使用typeof Greeter,即“给我Greeter类本身的类型”,而不是实例类型。或者更确切地说,“给我称为Greeter的符号的类型”,这是构造函数的类型。 ...

再次感谢您的帮助!

解决方法

将类用作类型时,打字稿会将其解释为该类的实例,而不是类的构造函数。如果需要构造函数,可以使用typeof MyClass

所以听起来您想键入gpioBuilder作为类构造函数,类型为typeof Gpio

import { Gpio } from "pigpio";

class PinManager {

    gpioBuilder: typeof Gpio
    constructor(builder: typeof Gpio){
        this.gpioBuilder = builder
    }

    buildNewGpioPin(pinNumber: number,direction: number){
        return new this.gpioBuilder(pinNumber,direction)
    }
}

export default PinManager

Playground