2017-12-22 7 views
0

Ich schreibe ein Modul, das einige Testsuiten, die unser Team benutzt, um einige Funktionen erweitert. Es ist ein Projekt mit einer Haupt-Typoskript-Datei, die andere Exporte aus unserem Projekt umschließt.Wie kann man Typings zusammen mit einem Modul exportieren?

index.d.ts:

export * from "./OneModule" 
export * from "./AnotherModule" 

Eines der Module eine Funktionalität, neue Methoden zu Chai.js Behauptung Bibliothek hinzuzufügen. Dies wird erreicht, indem sie Funktionen für das Hinzufügen neuer Methoden, beispielsweise mit:

assertion.addChainableMethod('newMethod', callback, chainCallback) 

fügt Fähigkeit Aussagen wie expect(something).to.be.newMethod() zu schreiben. TypeScript erkennt diese neuen Methoden jedoch nicht, da der Typ Assertion in @types/chai offensichtlich diese Funktionen nicht besitzt.

Ich habe Schnittstellendefinition haben, um mit der Chai Assertion wie folgt zusammengefasst werden:

declare namespace Chai { 
    interface Assertion { 
     newMethod(something: string): Assertion; 
     newMethod: Assertion; 
    } 
} 

Die addChainableMethod neue Methode ergänzt, so dass es auch chaines als expect(something).to.be.newMethod.equals() sein kann, das ist, warum es sowohl als Eigenschaft definiert werden muss und Methode.

Das Problem ist, egal wie ich die obige Deklaration zu index.d.ts hinzufügen, sind die neuen Assertions im importierenden Projekt nicht sichtbar. Ich vermute, dass es irgendwie in den Modul-Namespace eingepackt ist (aber ich könnte mich da sehr irren). Ich weiß, dass ich @types/newAssertions tun und sie dort definieren kann, aber das erfordert, dass Benutzer 2 Projekte in package.json einschließen, und erfordert auch unsere Entwickler, um 2 Projekte gleichzeitig zu behandeln. Wie kann ich sowohl meine Chai Namespace-Erweiterung als auch alle meine Module exportieren?

Das Beste, was ich geschafft habe, ist, etwas zu tun, wie folgt aus:

declare module 'my-module' { 
    function AddNewAssertions(chai: any, utils: any): void; 
} 
declare namespace Chai { 
    interface Assertion { //same as above } 
} 

Aber damit kann ich meine anderen Module nicht aussetzen, und es funktioniert nur, wenn ich Aussetzen nur AddNewAssertions Funktion, die jene ergänzt Behauptungen. Das funktioniert aber perfekt.

Antwort

1

klopfte ich einen sehr einfachen Test-App für diesen, und ich hatte eine gewissen Erfolg mit dem Hinzufügen:

declare global { 
    namespace Chai { 
     interface Assertion { 
      newMethod(something: string): Assertion; 
      newMethod: Assertion; 
     } 
    } 
} 

Diese die Erweiterung sichtbar in den anderen Modulen macht, nicht nur den mit der Erklärung.

Verwandte Themen