2016-02-04 12 views
5

Ich versuche, Typoskriptdefinitionen für ein Angular 2-Projekt zu erstellen, an dem ich arbeite, damit es eine exportierbare Bibliothek sein kann.Typoskriptfehler beim Festlegen der Deklaration auf TRUE

Ich habe mehr Dienste-Setup, die HTTP-Anforderungen an alle Komponenten ganz ähnlich wie die folgenden zurück:

public create(user:User) { 
    return this.http.post(this._apiUrls.create, 
    JSON.stringify(user), { 
     headers: this.apiConfig.getApiHeaders() 
    }); 
} 

die ich dann von einer Komponente in etwa so nennen:

Session.create(user).subscribe((res:Response) => { 
    this.user = res.json().user 
}); 

Dies alles funktioniert Gut, bis ich 'Deklaration' in der tsconfig-Datei auf 'true' stelle, damit ich Typoskript-Definitionsdateien erstellen kann. Ich beginne die folgenden Fehler für einige meiner Dienstleistungen zu erhalten:

error TS4053: Return type of public method from exported class has or is using name 'Observable' from external module "node_modules/rxjs/Observable" but cannot be named. 

ich meistens das Problem verstehen, aber ich weiß keine Lösung. Wenn ich Observable in den Dienst importiere, wirft das Typoskript linter Fehler, weil es technisch nicht in dieser Datei verwendet wird.

Von Angular 1 kommend, war dies ein ähnliches Paradigma, das wir in all unseren Apps verwendet haben, um unseren Code zu trennen, aber vielleicht muss ich den Ansatz in Angular 2 ändern? Ich habe mir viele andere Angular 2-Beispiele angeschaut und alle haben es auch auf ähnliche Weise gemacht.

Antwort

5

Ab heute importiert der Compiler nicht automatisch Typen für Sie in einer Deklarationsdatei.

Die beste Problemumgehung für den Augenblick besteht darin, Ihre Lint-Regeln für den Import manuell zu deaktivieren oder den Typ zu importieren und eine explizite Typ-Annotation zu verwenden, damit der Linter sie als Verwendung markiert.

Mit anderen Worten

// Explicit import of 'Observable' so that '.d.ts' files 
// can be generated correctly. 
import { Observable } from "node_modules/rxjs/Observable"; 

// Explicit use of 'Observable' to satisfy your linter. 
public create(user: User): Observable { 
    return this.http.post(this._apiUrls.create, 
    JSON.stringify(user), { 
     headers: this.apiConfig.getApiHeaders() 
    }); 
} 
+0

Einige Beispiele schön gewesen wäre, – DarkNeuron

+0

ich Ihre Lösung nicht verstanden. Kannst du mir deutlicher erklären, was zu tun ist? –

+1

Der Autor sagte, dass, wenn sie 'Observable' explizit importieren (d. H.' {Observable} von "node_modules/rxjs/Observable" 'importieren), dann wird das den Fehler beheben. Das ist also die Lösung. Die Sache, die diese Lösung problematisch machte, ist, dass ihr linker als "Observable" betrachtet wurde, um ungenutzt zu sein. Die Lösung für * das * sollte tatsächlich 'Observable' als Rückgabetyp verwenden (d. H. 'Public create (user: User): Observable'). Ich habe meine Antwort aktualisiert, um zu klären. –