O que está acontecendo
O problema é que instanceof
é uma construção do JavaScript e, em JavaScript, instanceof
espera um valor para o operando do lado direito. Especificamente, no x instanceof Foo
JavaScript irá executar uma verificação de tempo de execução para ver se Foo.prototype
existe em qualquer lugar na cadeia de protótipos de x
.
No entanto, no TypeScript, interface
s não têm emit. Isso significa que Foo
nem Foo.prototype
existe 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 interface
para 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 x
e y
que tem o mesmo tipo, mas se tentar usar instanceof
em um deles, obterá o resultado oposto no outro. Então, instanceof
não vai realmente dizer muito sobre o tipo se você está aproveitando tipos estruturais à máquina.
Foo | string
.