TL;DR
instanceof
fonctionne avec des classes, pas avec des interfaces ni des alias de types.
Que cherche à me dire TypeScript ?
Le problème est que instanceof
est une construction de JavaScript, et en JavaScript, instanceof
s'attend à une valeur du côté droit de l'opérande. Plus précisément, dans x instanceof Foo
, JavaScript effectuera une vérification à l'exécution pour voir si Foo.prototype
existe quelque part dans la chaîne de prototype de x
.
Cependant, en TypeScript, les interface
n'ont pas d'émission. Il en va de même pour les alias de type
. Cela signifie que ni Foo
ni Foo.prototype
n'existent à l'exécution, donc ce code échouera certainement.
TypeScript essaie de vous dire que cela ne pourrait jamais fonctionner. Foo
n'est qu'un type, ce n'est pas du tout une valeur !
Si vous venez d'une autre langue, vous avez peut-être voulu utiliser une classe ici. Les classes créent des valeurs à l'exécution, mais il y a certaines notes à ce sujet que vous voudrez peut-être lire ci-dessous.
"Que puis-je faire à la place de instanceof
si je veux toujours un type
ou une interface
?"
Vous pouvez regarder du côté des gardes de type et des gardes de type définis par l'utilisateur.
"Mais que se passe-t-il si je viens de passer d'une interface
à une classe
?"
Vous pourriez être tenté de passer d'une interface
à une classe
, mais vous devez réaliser que dans le système de type structurel de TypeScript (où les choses sont principalement basées sur la forme), vous pouvez produire un 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: C = {
a: 10, b: true, c: "hello",
}
// Fonctionne !
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
sur l'un ou l'autre, vous obtiendrez le résultat opposé sur l'autre. Ainsi, instanceof
ne vous dira vraiment pas grand-chose sur le type si vous profitez des types structurels en TypeScript.
0 votes
Voir la réponse ci-dessous @4castle. Sinon, vous avez raison, je le ferai
Foo | string
.1 votes
Possible duplicate de Vérification du type d'interface avec Typescript
0 votes
Et doublon possible de Vérifier si la variable est d'un type d'interface spécifique dans une union typescript (Je ne veux pas vraiment marteler cela tout seul)
1 votes
@Jenny O'Reilly, maintenant c'est certainement un doublon d'un Possible doublon!