2017-11-26 4 views
0

Ich erkläre, ein Modell in ingredient.model.tsAngular 5 Modelle Httpclient type casting

export class Ingredient { 
constructor(private name: string, public amount: number) {} 

getName() { return this.name } 
} 

In ingredients.service.ts, wenn ich sie auf diese Weise erhalten:

httpClient.get<Ingredient>(url).subscribe(
(igredient) => { 
    console.log(igredient.getName()); 
}); 

gibt es Fehler in der Konsole, z. B. "keine Methode getName in property igridient".

Auch wenn ich versuche, eine Eigenschaft Typ Category [] zu deklarieren, schlägt es fehl, aber Array scheint gut zu funktionieren.

Bearbeiten: Ich möchte mehr Informationen zur Verfügung stellen.

{ 
name: "Apple", 
amount: "5", 
created_at: "date", 
} 

Der igredient Konstruktor nicht einmal aufgerufen wird, damit die GET-Nutzlast wird nicht analysiert werden:

das igredient Modell und die folgende JSON Struktur gegeben.

+0

Dies ist Typoskript, nicht Java! Versuchen Sie vielleicht mit echten Accessoren https://www.typescriptlang.org/docs/handbook/classes.html#accessors –

+0

Angulars Dokumentation besagt eindeutig, dass automatisches Casting durch HttpClient möglich ist. – zangarmarsh

Antwort

1

Sie müssen eine Eigenschaft verwenden, keine Methode. Das zurückgegebene Objekt ist wirklich ein JSON-Objekt, und es gibt keine "getName()" -Methode (trotz Ihrer Bemühungen, eine Typinformation hinzuzufügen). Versuchen Sie etwas wie folgt:

export interface Ingredient { 
    strin: string, 
    amount: number, 
    created_at: string 
} 


httpClient.get<Ingredient>(url).subscribe(
    (igredient) => { 
      console.log(igredient.amount); 
}); 

EDIT: Sie müssen eine Typinformation basierend auf dem erwarteten JSON-Objekt bereitstellen. Wenn das zurückgegebene JSON-Objekt die Attribute strin, amount und created_at hat, müssen Sie einen Typ definieren, der mit dem erwarteten JSON-Objekt kompatibel ist.

+0

Was ist also eine benutzerdefinierte Inhaltsstoffklasse? PS: Wenn ich einen Debugger in den Konstruktor einfüge, wird er nicht einmal aufgerufen! – zangarmarsh

+1

'ingredient.name' gibt keinen Fehler aus, weil Sie einen Typ' Ingredient' definiert haben. – realharry

+0

ok, danke. Das wusste ich nicht. Schau dir das EDIT an, ich habe immer noch Probleme. – zangarmarsh