Que esta pasando
El problema es que instanceofes una construcción de JavaScript, y en JavaScript, instanceofespera un valor para el operando del lado derecho. Específicamente, en x instanceof FooJavaScript se realizará una verificación en tiempo de ejecución para ver si Foo.prototypeexiste en algún lugar de la cadena de prototipos de x.
Sin embargo, en TypeScript, los interfaces no tienen emisión. Eso significa que ni Fooni Foo.prototypeexisten en tiempo de ejecución, por lo que este código definitivamente fallará.
TypeScript está tratando de decirle que esto nunca podría funcionar. Fooes 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 interfacea 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 xy ytiene el mismo tipo, pero si intenta usar instanceofen cualquiera de los dos, obtendrá el resultado opuesto en el otro. Por instanceoflo tanto , no le dirá mucho sobre el tipo si está aprovechando los tipos estructurales en TypeScript.
Foo | string.