Warum gibt 'instanceof' in TypeScript den Fehler "'Foo' bezieht sich nur auf einen Typ, wird aber hier als Wert verwendet."?

9

Ich habe diesen Code geschrieben

%Vor%

Aber TypeScript gab mir diesen Fehler:

%Vor%

Warum passiert das? Ich dachte, dass instanceof prüfen könnte, ob mein Wert einen bestimmten Typ hat, aber TypeScript scheint das nicht zu mögen.

    
Daniel Rosenwasser 12.10.2017, 07:01
quelle

1 Antwort

18

Was ist los?

Das Problem ist, dass instanceof ein Konstrukt von ist JavaScript und in JavaScript erwartet instanceof einen Wert für den rechten Operanden. Insbesondere wird in x instanceof Foo JavaScript eine Laufzeitprüfung durchführen, um festzustellen, ob Foo.prototype irgendwo in der Prototypkette von x existiert.

In TypeScript hat interface s jedoch keine Ausgabe. Das bedeutet, dass Foo.prototype zur Laufzeit nicht existiert, daher wird dieser Code definitiv fehlschlagen.

TypeScript versucht Ihnen dort eine Warnung zu geben: Foo ist nur ein Typ; Es ist überhaupt kein Wert!

"Was kann ich anstelle von instanceof ?"

tun

Sie können Wächter und benutzerdefinierten Typ eingeben Wachen .

"Aber was, wenn ich gerade von einem interface zu einem class gewechselt habe?"

Sie könnten versucht sein, von einem interface zu einem class zu wechseln, aber Sie sollten wissen, dass Sie in TypeScripts Strukturtypsystem (wo Dinge hauptsächlich shape-basiert sind ) beliebige erzeugen können ein Objekt, das die gleiche Form wie eine bestimmte Klasse hat:

%Vor%

In diesem Fall haben Sie x und y , die denselben Typ haben, aber wenn Sie instanceof für beide verwenden, erhalten Sie das gegenteilige Ergebnis auf der anderen Seite. So wird instanceof Ihnen nicht viel über den Typ sagen, wenn Sie die Strukturtypen in TypeScript nutzen.

    
Daniel Rosenwasser 12.10.2017, 07:02
quelle