2017-01-14 44 views
7

jestem importowania kątowe w moim kątowej 1 app (w maszynopisie) przy użyciu składni jak poniżejmaszynopis importowania źle kątowe

import * as angular from 'angular'; 

ten importuje kątowy z angular-mocks a nie z angular z powodu których moja realizacja ILogService zawodzi

BŁĄD w pliku ./app/shared/Logger.factory.ts (38,7): błąd TS2420: Klasa "Rejestrator" nieprawidłowo implementuje interfejs "ILogService". Typy "debugowania" właściwości są niezgodne. Typ '(... argument: any []) => void' nie można przypisać "ILogCall".

Nawet gdy próbuję nawigować do 'angular' od vscode mi się poruszać, aby kątowe-drwi kątową definicji. Powinno się przejść do kanciastej, a nie do fałszywej biblioteki ...

Jak uniknąć tego problemu?

EDIT

Poniżej jest realizacja

Wdrożenie mam to niestandardowe usługi, o której maszynopis daje błąd podczas kompilacji (błąd jest wklejony powyżej)

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

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

* z powodu których nie moja realizacja ILogService * - których realizacja? Podaj cały kod, który jest niezbędny do odtworzenia problemu. Zobacz http://stackoverflow.com/help/mcve. * To importuje kąt z makiet kątowych, a nie z kanciastych * - skąd wziął się ten wniosek? Sposób, w jaki kod VS porusza się pomiędzy klasami, wpływa tylko na sposób poruszania się, nic więcej. – estus

+0

Zobacz: https://stackoverflow.com/q/40664298/4110233. Odpowiedzi są tutaj: – TheChetan

Odpowiedz

1

Jest to spowodowane tym, że pisanie kpiąco-mock jest rozszerzeniem do kąta. Innymi słowy, prawdziwy interfejs ILogCall powinno być:

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

Więc w kodzie:

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

trzeba zwracać poprawny obiekt ILogCall (ze wszystkimi członków). @TheChetan i @Natarajan Nagarajugari odpowiedź może być pomocna, ale nie jestem pewien, czy to by złamało twoje testy jednostek piszących TypeScript.

Moje rozwiązanie jest w informacji (komunikat: string):

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

    return logCall as ng.ILogCall; 
} 
+0

, więc jeśli nie mylę się, sugerujesz implementację obu interfejsów –

+0

to jest OK, ale czy istnieje sposób Mogę wyłączyć ładowanie definicji z makiet kątowych –

1

spróbować to ..

import * as _angular_ from 'angular'; 

declare global { 
const angular: typeof _angular_; 
} 

Mam nadzieję, że pomogłoby ci

+1

byłoby pomocne, gdybyś mógł wyjaśnić tę odpowiedź, dlaczego zadziała –