Was ist los
Das Problem ist, dass instanceof
es sich um ein Konstrukt aus JavaScript handelt und in JavaScript instanceof
einen Wert für den Operanden auf der rechten Seite erwartet . Insbesondere wird in x instanceof Foo
JavaScript eine Laufzeitprüfung durchgeführt, um festzustellen Foo.prototype
, ob irgendwo in der Prototypenkette von vorhanden ist x
.
In TypeScript haben interface
s jedoch keine Emission. Das bedeutet, dass zur Laufzeit weder Foo
noch Foo.prototype
vorhanden ist, sodass dieser Code definitiv fehlschlägt.
TypeScript versucht Ihnen mitzuteilen, dass dies niemals funktionieren könnte. Foo
ist 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 interface
zu 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 x
und y
das haben den gleichen Typ, aber wenn Sie versuchen, eines instanceof
von beiden zu verwenden, erhalten Sie das andere Ergebnis auf dem anderen. Sie instanceof
werden also nicht wirklich viel über den Typ erzählen, wenn Sie strukturelle Typen in TypeScript nutzen.
Foo | string
.