2016-02-04 7 views
5

Sto provando a creare definizioni di dattiloscritto per un progetto Angular 2 su cui sto lavorando affinché possa essere una libreria esportabile.Errori del dattiloscritto quando si imposta la dichiarazione su TRUE

Ho diversi servizi di installazione che restituiscono le richieste HTTP a tutti i componenti del tutto simile a quanto segue:

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

che ho poi chiamata da un qualcosa di componenti del genere:

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

Questa tutte le opere va bene finché non avanzo 'dichiarazione' su true nel file tsconfig in modo che possa creare file di definizione del dattiloscritto. Comincio a ottenere i seguenti errori per molti dei miei servizi:

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. 

Capisco la maggior parte del problema, ma non so una soluzione. Se importare Observable nel servizio, allora il linter del dattiloscritto genererà errori perché tecnicamente non viene usato in quel file.

Provenendo da Angular 1 questo era un paradigma simile che abbiamo preso in tutte le nostre app per rompere il nostro codice a parte, ma forse ho bisogno di cambiare l'approccio in Angular 2? Ho esaminato molti altri esempi di Angular 2 e l'hanno fatto tutti allo stesso modo.

risposta

5

A partire da oggi, il compilatore non importerà automaticamente i tipi per voi in un file di dichiarazione.

La soluzione migliore per il momento è disabilitare manualmente le regole del filetto per l'importazione, oppure importare il tipo e utilizzare un'annotazione di tipo esplicito in modo che il linter lo contrassegni come un utilizzo.

In altre parole

// 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

Alcuni esempi sarebbe stato bello – DarkNeuron

+0

Non ho capito la vostra soluzione. Puoi spiegarmi più chiaramente su cosa fare? –

+1

L'autore ha affermato che se importano "Osservabile" esplicitamente (cioè "importa {Osservabile} da" node_modules/rxjs/Observable "'), allora questo risolverà l'errore. Quindi questa è la soluzione. La cosa che ha reso problematica questa soluzione è che il loro linter considerava "Osservabile" inutilizzato. La soluzione per * that * era effettivamente usare 'Observable' come tipo di ritorno (ad esempio' public create (user: User): Observable'). Ho aggiornato la mia risposta per chiarire. –