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ă