Ich habe eine Typoskript Datei config.ts
, die mit Knoten ausgeführt werden:Kann ich eine benutzerdefinierte Modulauflösungsfunktion (wie "proxyquire") anstelle von require() mit TypeScript verwenden?
import myDependency = require('my-dependency');
export = {
doSomething =() => {
...
}
}
In anderer Typoskript-Datei, kann ich import
diese Datei mit voller Typsicherheit:
import config = require('./config');
config.doSomething();
config.doSomethingElse(); // compiler error, this method doesn't exist
Nun ich Unit-Test will Dieses Skript. Um die Abhängigkeiten zu überspielen, die dieses Skript require()
s verwendet, benutze ich proxyquire, die mir die Werte zur Verfügung stellen, die mein Skript erhalten wird, wenn es Aufrufe an require()
aufruft. Hier ist, was mein Test aussehen könnte:
import proxyquire = require('proxyquire');
const config = proxyquire('./config', {
'my-dependency': {} // this mocked object will be provided when config.ts asks for `my-dependency`
});
expect(config.doSomething()).to.do.something();
Dies funktioniert gut, außer dass meine config
Variable vom Typ any
weil ich proxyquire()
anstelle von require()
bin mit. TypeScript muss der require()
-Funktion eine spezielle Behandlung geben, damit sie die Modulauflösung ausführen kann. Gibt es eine Möglichkeit, dem TypeScript-Compiler mitzuteilen, dass proxyquire()
auch die Modulauflösung ausführen soll, ähnlich wie require()
?
Ich könnte config.ts
als eine Klasse umschreiben oder es eine Schnittstelle verwenden. Dann wäre ich in der Lage, die Variablen in meinen Tests explizit durch Importieren der Klassen-/Schnittstellendefinition einzugeben. Aber proxyquire()
zu erlauben, implizit die Dinge für mich zu tippen, wäre weit die leichtere Lösung.