Que se passe-t-il
Le problème est qu'il instanceof
s'agit d'une construction de JavaScript, et en JavaScript, instanceof
attend une valeur pour l'opérande de droite. Plus précisément, en x instanceof Foo
JavaScript effectuera une vérification d'exécution pour voir s'il Foo.prototype
existe n'importe où dans la chaîne de prototypes de x
.
Cependant, dans TypeScript, les interface
s n'ont pas d'émission. Cela signifie que ni Foo
ni Foo.prototype
n'existe au moment de l'exécution, donc ce code échouera définitivement.
TypeScript essaie de vous dire que cela ne pourrait jamais fonctionner. Foo
est juste un type, ce n'est pas du tout une valeur!
"Que puis-je faire à la place de instanceof
?"
Vous pouvez examiner les protections de type et les protections de type définies par l'utilisateur .
"Mais que faire si je passais juste d'un interface
à un class
?"
Vous pourriez être tenté de passer de an interface
à a class
, mais vous devez comprendre que dans le système de type structurel de TypeScript (où les choses sont principalement basées sur la forme ), vous pouvez produire n'importe quel objet qui a la même forme qu'une classe donnée:
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;
Dans ce cas, vous avez x
et y
qui ont le même type, mais si vous essayez d'utiliser instanceof
l'un ou l'autre, vous obtiendrez le résultat opposé sur l'autre. Donc instanceof
, ne vous en dira pas vraiment beaucoup sur le type si vous tirez parti des types structurels de TypeScript.
Foo | string
.