javascript - Typescript - typdefinition för egna klasser utan att importera dem


Jag använder dependency injection med TypeScript, vilket betyder att jag kan skapa ett objekt i ett modul utan att importera klassen (jag importerar istället en Injector som ger mig objektinstansen jag behöver). Om jag nu vill ange en typ för variabeln som tar emot, får jag ett Unresolved type-fel. Någon bra lösning för det?

Exempel

Ett objekt av typen 'MainHelper' returneras av Injector.injectMainHelper(); men typen är okänd för den aktuella modulen, eftersom jag inte har importerat MainHelper (och jag vill inte importera det).

let mainHelper:MainHelper = Injector.injectMainHelper();

Du kan kolla hela koden här.

Svar #1

Hur är det med att deklarera gränssnitt?

interfaces.d.ts

interface IMainHelper {
    //... 
}

main_helper.ts

class MainHelper implements IMainHelper {
    //... 
}

annan_fil.ts

/// <reference path="./interfaces.d.ts" />

import Injector from "./injector";

let mainHelper: IMainHelper = Injector.injectMainHelper();

Observera: Om du lägger till referensen i din tsconfig.json behöver du inte lägga till den i filen.

Uppdatera

Jag försökte precis och om du har två filer:

test1.ts

class MainHelper {

}

var Injector = {
    injectMainHelper: function() {
        return new MainHelper();
    }
}

export default Injector;

test2.ts

import Injector from "./test1";

let mainHelper = Injector.injectMainHelper(); // mainHelper is MainHelper

TypeScript kan härleda typen av mainHelper. Om du inte anger typen kommer kompilatorn automatiskt att upptäcka dess typ.

Om du har något mer generellt som:

var Injector = {
    injectSomething: function(somethingID) {
        // find something and dependencies
        return new Something(..dependencies);
    }
}

Lösningen skulle vara att använda generics:

let mainHelper = Injector.injectSomething<MainHelper>("mainHelperID");

Men i så fall kommer du att behöva gränssnitt igen...