问题描述
我有一个我想使用的模块称为Pigpio,该模块导出一个名为Gpio
的类
我想将此类作为依赖项注入另一个类中,以便可以使用它来构建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类的新实例时,出现一条错误消息,告诉我属性中没有该类的构造函数:
我敢肯定,这是因为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