2017-01-14 2 views
7

Ich importiere Winkel in meinem Winkel 1 app (in Typoskript) wie Syntax unterTyposkript Import falsche Winkel

import * as angular from 'angular'; 

Diese von angular-mocks Winkel importiert und nicht von angular wegen der meine ILogService Implementierung

schlägt fehl

FEHLER in ./app/shared/Logger.factory.ts (38,7): Fehler TS2420: Klasse 'Logger' implementiert die Schnittstelle 'ILogService' falsch. Die Typen property 'debug' sind nicht kompatibel. Typ '(... argument: any []) => void' kann nicht dem Typ 'ILogCall' zugewiesen werden.

Auch wenn ich versuche, 'angular' von vscode ich navigiert Winkel spottet Winkel Definition erhalten zu navigieren. Es sollte navigiert werden, um eckig zu werden und Bibliothek nicht zu spotten ...

Wie man dieses Problem vermeidet?

EDIT

Unten ist die Implementierung von

Die Implementierung ich habe ist, individueller Service, über die Typoskript einen Fehler während der Kompilierung gibt (den Fehler oben eingefügt)

class Logger implements ng.ILogService { 
    info(message:string) { //some custom logic in info method} 
} 

angular.service('logger', Logger) 
+2

* wegen der meine ILogService Umsetzung scheitert * - die Umsetzung? Bitte geben Sie den gesamten Code an, der zur Replizierung des Problems erforderlich ist. Siehe http://stackoverflow.com/help/mcve. * Dies importiert Winkel aus Winkel-Mocks und nicht aus eckigen * - woher kam diese Schlussfolgerung? Die Art, wie VS Code zwischen Klassen navigiert, wirkt sich nur auf die Art und Weise aus, wie es navigiert, sonst nichts. – estus

+0

Siehe: https://stackoverflow.com/q/40664298/4110233. Die Antworten sind hier – TheChetan

Antwort

1

Es wird verursacht, weil angular-mocks Typisierung eine Augmentation zu eckigen ist. Mit anderen Worten sollte eine echte ILogCall Schnittstelle sein:

interface ILogCall { 
    (...args: any[]): void; //from @types\angular\index.d.ts 
    logs: string[]; //from @types\angular-mocks\index.d.ts 
} 

So in Ihrem Code:

info(message:string) { //some custom logic in info method} 

Sie müssen ein korrektes ILogCall Objekt zurückzukehren (mit allen Mitgliedern). @TheChetan und @Natarajan Nagarajugari's Antwort kann hilfreich sein, aber ich bin mir nicht sicher, ob es deine TypeScript-Schreibeinheitentests brechen würde.

Meine Lösung ist in info (message: string):

info(message:string) 
{ 
    var logCall: any = (...args: any[]) => {}; 
    logCall.logs = //something; 

    return logCall as ng.ILogCall; 
} 
+0

Also wenn ich nicht falsch liege, schlagen Sie vor, beide Schnittstellen zu implementieren –

+0

das ist eine Art OK-Lösung, aber gibt es einen Weg, wo Ich kann das Laden von Definitionen von Angular-Mocks deaktivieren –

1

try dies ..

import * as _angular_ from 'angular'; 

declare global { 
const angular: typeof _angular_; 
} 

Hoffe, es würde Ihnen helfen

+1

Es wäre hilfreich, wenn Sie diese Antwort erklären können, warum es funktioniert –

Verwandte Themen