typescript - Cum să injectezi o clasă într-alta pentru utilizare ca constructor în clasele es6
Am un modul pe care mi-ar plăcea să-l folosesc numit pigpio care exportă o clasă numită Gpio
Vreau să injectez această clasă ca o dependență într-o altă clasă astfel încât să o pot folosi pentru a construi instanțe 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
Problema este că, atunci când încerc să apelez this.gpioBuilder pentru a construi noua instanță a clasei Gpio, primesc o eroare care îmi spune că nu există niciun constructor pentru clasă în proprietate:
Sunt sigur că acest lucru se întâmplă deoarece clasele ES6 sunt doar zahăr sintactic pentru modelul de moștenire prin prototip al JavaScript, dar nu sunt sigur cum să rezolv asta.
Vreau să injectez Gpio ca o dependență astfel încât să fie mai ușor de simulat în teste, dar dacă nu pot face injectarea dependenței în acest mod, nu sunt complet sigur cum să o fac.
Actualizează postarea cu răspunsul corect
După exemplul dat de Alex, am reușit să corectez clasa mea și să elimin erorile:
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
De asemenea, m-am uitat înapoi prin manualul TypeScript pentru explicația motivului pentru care funcționează asta (am citit manualul și nu am văzut-o, se pare că pur și simplu nu ajunsesem încă la acea parte):
https://www.typescriptlang.org/docs/handbook/classes.html#constructor-functions
Partea importantă fiind:
... Aici folosim typeof Greeter, adică „dă-mi tipul clasei Greeter în sine” mai degrabă decât tipul instanței. Sau, mai precis, „dă-mi tipul simbolului numit Greeter,” care este tipul funcției constructor. ...
Mulțumesc din nou pentru ajutor!!
Răspuns #1
Când folosești o clasă ca tip, TypeScript interpretează asta ca instanțe ale acelei clase și nu ca constructorul clasei. Poți folosi typeof MyClass dacă vrei constructorul.
Deci se pare că vrei să tastezi gpioBuilder ca tipul constructorului de clasă 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
Teren de joacă

