javascript - Stängningar i Typescript (Beroendeinjektion)
Jag blir helt slagen när jag försöker använda TypeScript på ett funktionellt sätt med beroenden. Låt oss säga att jag vill göra en modul som är beroende av en annan modul.
Om jag inte använde Dependency Injection skulle det se ut så här (i Node).
SomeOtherModule = require("SomeOtherModule")
exports.doSomething = function() {
SomeOtherModule.blah()
}
Så här gör jag det med Dependency Injection
module.exports = function(SomeOtherModule) {
function doSomething() {
SomeOtherModule.blah()
}
return {doSomething: doSomething};
}
I TypeScript, om du definierar en konkret klass eller modul kan du bara skriva typerna för funktionerna när du exporterar dem eller inkludera dem i klassen. Det är helt okej att ha dem bredvid varandra.
Men eftersom jag inte kan definiera en modul inne i DI-funktionen, är det enda sättet jag kan se att göra detta att definiera ett gränssnitt för objektet jag returnerar separat, vilket är irriterande, eftersom jag vill ha typanteckningarna i linje med definitionerna.
Vad är ett bättre sätt att göra detta?
Svar #1
Detta kommer förmodligen ge dig en bra start: http://blorkfish.wordpress.com/2012/10/23/typescript-organizing-your-code-with-amd-modules-and-require-js/
Jag vet inte om det här är det bästa sättet att ställa in det på. Men jag fick det att fungera.
Svar #2
Jag slutade med AMD på mitt projekt, eftersom jag också använder AngularJS och de krockar med varandra. Jag fortsatte dock att använda samma DI-mönster genom hela projektet, så i slutändan ser det ut så här.
Jag är ganska nöjd med det. Jag experimenterar med att använda klasser istället (du kan komma riktigt nära om du håller din modul stateless och låter konstruktorn vara injektionsfunktionen), men jag gillade inte att behöva använda this för alla beroenden.
Dessutom köper klasser faktiskt inget åt mig, eftersom om jag skulle koda till ett gränssnitt skulle jag ändå behöva definiera typerna två gånger.
interface IMyService {
doSomething();
}
module.exports = function(SomeOtherModule) {
return {doSomething: doSomething}
function doSomething() {
SomeOtherModule.blah()
}
}
