2016-10-20 6 views
2

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.

Antwort

0

Es gibt eine Abhilfe - die Art des config.ts Modul durch tatsächliche Modul Import und Verwendung typeof in einer Typumwandlung bekommen:

import proxyquire = require('proxyquire'); 

import configType = require('./config'); 

const config = <typeof configType> proxyquire('./config', { 
    'my-dependency': {} // this mocked object will be provided when config.ts asks for `my-dependency` 
}); 

config.doSomething(); 

// config.noSuchMethod(); // does not compile 

das gleiche Modul in Ihrem Das ist nicht ideal, weil Sie importieren Testen Sie zweimal - das echte, um nur auf die Art von es zu bekommen und "proxiquired" eins, um tatsächlich in Ihren Tests zu verwenden, und Sie müssen aufpassen, die zwei nicht zu verwechseln. Aber es ist ziemlich einfach im Vergleich zu der Aufgabe, eine andere Variante der Modulauflösung für Typoskript zu implementieren. Wenn configType auf diese Weise verwendet wird - nur für die Eingabe -, wird der Import nicht einmal in generiertem JavaSript-Code angezeigt.

Verwandte Themen