O que está acontecendo
O problema é que instanceof é uma construção do JavaScript e, em JavaScript, instanceofespera um valor para o operando do lado direito. Especificamente, no x instanceof FooJavaScript irá executar uma verificação de tempo de execução para ver se Foo.prototypeexiste em qualquer lugar na cadeia de protótipos de x.
No entanto, no TypeScript, interfaces não têm emit. Isso significa que Foonem Foo.prototypeexiste nem em tempo de execução, portanto, este código irá falhar definitivamente.
O TypeScript está tentando dizer que isso nunca funcionaria. Fooé apenas um tipo, não é um valor!
"O que posso fazer em vez de instanceof?"
Você pode examinar os protetores de tipo e os protetores de tipo definidos pelo usuário .
"Mas e se eu apenas mudasse de um interface para um class?"
Você pode ficar tentado a mudar de um interfacepara um class, mas você deve perceber que no sistema de tipo estrutural do TypeScript (onde as coisas são principalmente baseadas na forma ), você pode produzir qualquer objeto que tenha a mesma forma de uma determinada classe:
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;
Nesse caso, você tem xe yque tem o mesmo tipo, mas se tentar usar instanceofem um deles, obterá o resultado oposto no outro. Então, instanceofnão vai realmente dizer muito sobre o tipo se você está aproveitando tipos estruturais à máquina.
Foo | string.