Typoskript instanceof funktioniert nicht
Habe ich Probleme mit dem instanceof-operator und es scheint nicht zu funktionieren. Hier ist ein Teil von meinem code:
const results = _.map(items, function(item: Goal|Note|Task, index: number) {
let result = {};
if (item instanceof Goal) {
result = { id: index, title: item.name };
} else if (item instanceof Note) {
result = { id: index, title: item.content.text };
} else if (item instanceof Task) {
result = { id: index, title: item.name };
}
console.log(item);
console.log(item instanceof Goal);
console.log(item instanceof Note);
console.log(item instanceof Task);
return result;
});
Alle meine logs sagen falsch, hier ist das, was die Konsole sieht wie folgt aus:
Keiner von Ihnen übereinstimmen, obwohl Sie ausdrücklich darauf hin, dass nur die 3 Arten wäre möglich. Sie konnte auch sehen, dass das Objekt sich mit einer typename Ziel, so verstehe ich nicht, warum es nicht mit mit instanceof Ziel.
Irgendwelche Ideen?
- Wie sind Sie zu generieren
items
? Entstehen Sie durch Konstruktoren? Wenn nicht, werden Sie nicht werden, die Instanzen einer bestimmten Klasse. - Hast du das Objekt kopieren vielleicht? Durch JSON.analysieren oder Objekt.zuweisen?
- Sie sind Antworten, die von einer API/http-Aufruf. Müssen, warum Ihre typeofs sind immer Objekte im Gegensatz zu bestimmten Typen?
- Recht. Für
instanceof
zu arbeiten, müssen Sie eigentliche machen von Konstruktoren. Sonst sind Sie nur Objekte, die zufällig die gleiche Form wie Ihre gewünschten Objekte. - Danke @MikeC, entschied sich für die Verwendung hasOwnProperty statt.
- oder nutzen Sie einfach typeguards. 🙂
- Ich denke nicht, dass eine der Lösungen auf StackOverflow eine umfassende Lösung für das problem. So, ich habe ein npm-Paket angular-http-deserializer für diese: npmjs.com/package/angular-http-deserializer#usage
Du musst angemeldet sein, um einen Kommentar abzugeben.
instanceof
wird true zurückgegeben, nur wenn es passt die Funktion oder Klasse, von dem es gebaut wurde. Dieitem
hier ist eine einfacheObject
.Wenn es aufgebaut ist mit einem Konstruktor-Funktion oder eine Klasse, dann instanceof funktioniert wie erwartet:
Wenn
Goal
ist einInterface
es wird nur die Struktur des Objekts, nicht seine Art. WennGoal
ist ein Konstruktor, dann sollte true zurückgeben, fürinstanceof
überprüft.Probieren Sie etwas wie:
Object
als Ergebnis für jede Art überprüft. Vielleicht möchten Sie versuchen, den Vergleichobj.constructor
. Hier ist, Konstruktor-Referenz und typeof-Referenzinstanceof
, nichttypeof
. Der Grund, warum es gescheitert, in meinem Fall welche, die eine andere Klasse mit dem gleichen Namen gab es in dem Projekt, und irgendwie bekam man importiert diese Datei anstelle von der, die ich meinte. (Ich hab da umgestaltet werden, die zwei unterschiedliche, aber ähnliche Daten, Modellen in einer einzigen, eindeutig ein.)Können Sie auch verwenden, geben Sie Wachen zu Ihrem Vorteil:
https://basarat.gitbooks.io/typescript/docs/types/typeGuard.html
https://www.typescriptlang.org/docs/handbook/advanced-types.html
Zum Beispiel, wenn Sie ein literal-Typ guard zu Ihrer Klasse:
dann der check ist so einfach wie :
Oder Sie schreiben Ihren eigenen Typ Garde:
type
wenn das Objekt geladen wird von der API. Aber es ist ein bisschen eine einfachere Lösung, dann die andere.Versuchen, instanziieren Sie das Objekt mit einem Konstruktor. Mir ist es passiert das gleiche, weil ich Sie manuell lustig das Objekt für Testzwecke. Wenn Sie das Element erstellt haben, wie Folgendes Beispiel sollte es funktionieren: