2017-03-20 13 views
6

Mam problemy z deklaracjami typu Typescript powielone w następującym przypadku:Typescript powielane deklaracje typu

Mam następujący drzewa zależności dla mojej aplikacji A:

A->@angular/http:2.3.1 
A->B->@angular/http:2.3.1 

A i B są zarządzane przez npm. Po uruchomieniu

npm install 

system plików wygląda następująco:

A/node_modules/ 
    @angular/http 
    ... 
    B/node_modules 
    @angular/http 

Problem wydaje się, że obecnie istnieją dwie deklaracje Rodzaj @ kątowe/http typy jak Response lub nagłówkami. I jakoś Typescript transpiler wydaje w stanie sobie z tym poradzić - co skutkuje następującym komunikatem o błędzie:

TS2453: Typ argumentem typu parametru „t” nie można wywnioskować z użytkowania. Rozważmy jawne podanie argumentów typu. Argument typu kandydata "Odpowiedź" nie jest poprawnym typem argumentu , ponieważ nie jest to supertypcja kandydata "Response". Typy nagłówków " " są niezgodne. Nie można przypisać nagłówka " ", aby wpisać "Nagłówki". Typy mają oddzielne deklaracje prywatnej właściwości "mayBeSetNormalizedName".

Czytanie wiadomości, wydaje mi się, że jest to typowy plik, który nie jest w stanie dorównać deklaracjom typu duplikowanego.

Ktoś doświadczył tego samego problemu? Jak poradzić sobie z tym problemem? Jak radzić sobie z takimi kolizjami nazw?

+0

Wiem, że istnieje podobne pytanie: http://stackoverflow.com/questions/42412938/argument-of-type-connectionbackend-is-not-assignable-to-parameter-of-type-con. Odpowiedź nie jest naprawdę satysfakcjonująca, ponieważ w moim przypadku nie mogę (nie chcę) po prostu przenieść źródła z B do A. Musi być inny sposób. – Robert

Odpowiedz

4

Tymczasem okazało się, że można naprawić ten błąd poprzez jawne zaimportowanie odpowiednich typów wewnątrz klasy A. W moim przypadku (komunikat o błędzie powyżej) musiałem:

import {Response, Headers} from '@angular/http'; 
+0

to działa również dla mnie. dzięki! –

+0

Dobrze, dziękuję za walidację! – Robert

1

Miałem ten sam problem. Zasadniczo istnieją dwa sposoby rozwiązania tego problemu.

  1. Zrób moduł UMD projektu B. Może to zająć dużo czasu
  2. użycie as any as TheRequiredObject patrz poniżej.

Załóżmy, że masz tę klasę w projekcie B:

export class B{ 
    getSome(): Observable { 
     return this.http.get('some_url'); 
    } 
} 

i to, co chcesz w projekcie a:

export class A{ 
    getSomeFromB: Observable{ 
     return B.getSome() as any as Observable; 
    } 
} 
Powiązane problemy