Que esta pasando
El problema es que instanceof
es una construcción de JavaScript, y en JavaScript, instanceof
espera un valor para el operando del lado derecho. Específicamente, en x instanceof Foo
JavaScript se realizará una verificación en tiempo de ejecución para ver si Foo.prototype
existe en algún lugar de la cadena de prototipos de x
.
Sin embargo, en TypeScript, los interface
s no tienen emisión. Eso significa que ni Foo
ni Foo.prototype
existen en tiempo de ejecución, por lo que este código definitivamente fallará.
TypeScript está tratando de decirle que esto nunca podría funcionar. Foo
es solo un tipo, ¡no es un valor en absoluto!
"¿Qué puedo hacer en lugar de instanceof
?"
Puede buscar en los protectores de tipos y los protectores de tipos definidos por el usuario .
"¿Pero qué pasa si acabo de cambiar de una interface
a una class
?"
Es posible que tenga la tentación de cambiar de an interface
a a class
, pero debe darse cuenta de que en el sistema de tipos estructurales de TypeScript (donde las cosas se basan principalmente en la forma ), puede producir cualquier objeto que tenga la misma forma que una clase determinada:
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;
En este caso, tiene x
y y
tiene el mismo tipo, pero si intenta usar instanceof
en cualquiera de los dos, obtendrá el resultado opuesto en el otro. Por instanceof
lo tanto , no le dirá mucho sobre el tipo si está aprovechando los tipos estructurales en TypeScript.
Foo | string
.