Was ist los
Das Problem ist, dass instanceofes sich um ein Konstrukt aus JavaScript handelt und in JavaScript instanceofeinen Wert für den Operanden auf der rechten Seite erwartet . Insbesondere wird in x instanceof FooJavaScript eine Laufzeitprüfung durchgeführt, um festzustellen Foo.prototype, ob irgendwo in der Prototypenkette von vorhanden ist x.
In TypeScript haben interfaces jedoch keine Emission. Das bedeutet, dass zur Laufzeit weder Foonoch Foo.prototypevorhanden ist, sodass dieser Code definitiv fehlschlägt.
TypeScript versucht Ihnen mitzuteilen, dass dies niemals funktionieren könnte. Fooist nur ein Typ, es ist überhaupt kein Wert!
"Was kann ich tun anstatt instanceof?"
Sie können sich Typschutz und benutzerdefinierte Typenschutz ansehen .
"Aber was ist, wenn ich gerade von einem interface zu einem gewechselt bin class?"
Sie könnten versucht sein, von einem interfacezu einem zu wechseln class, aber Sie sollten sich darüber im Klaren sein, dass Sie im strukturellen Typensystem von TypeScript (bei dem die Dinge hauptsächlich formbasiert sind ) jedes Objekt erzeugen können, das dieselbe Form wie eine bestimmte Klasse hat:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
x = y;
y = x;
In diesem Fall haben Sie xund ydas haben den gleichen Typ, aber wenn Sie versuchen, eines instanceofvon beiden zu verwenden, erhalten Sie das andere Ergebnis auf dem anderen. Sie instanceofwerden also nicht wirklich viel über den Typ erzählen, wenn Sie strukturelle Typen in TypeScript nutzen.
Foo | string.