Comment vérifier le type d'objet sur l'exécution dans la Machine?
J'essaie de trouver un moyen de passer d'un objet à la fonction et vérifier le type à un moment de l'exécution. C'est un pseudo-code:
func(obj:any){
if(typeof obj === "A"){
//do something
}
else if(typeof obj === "B"{
//do something else
}
}
a:A;
b:B;
func(a);
Mais typeof est toujours de retour "objet" et je ne pouvais pas trouver un moyen d'obtenir le type réel de "a" ou "b". Le instanceof ne pas travailler et revenir par le même.
Aucune idée de comment le faire dans un Tapuscrit?
Merci pour votre aide!!!
OriginalL'auteur Eden1971 | 2017-05-19
Vous devez vous connecter pour publier un commentaire.
Types sont retirés au moment de la compilation et ne pas exister au moment de l'exécution, de sorte que vous ne pouvez pas vérifier le type à l'exécution.
Ce que vous pouvez faire est de vérifier que la forme d'un objet est ce que vous attendez, et la Machine peut faire valoir le type au moment de la compilation à l'aide d'un type défini par l'utilisateur garde qui retourne true (annoté type de retour est de type "prédicat" de la forme
arg is T
) si la forme correspond à vos attentes:Exemple dans l'aire de Jeux
À quelle profondeur vous prendre la garde de la mise en œuvre est vraiment à vous, il suffit de retourner la valeur true ou false. Par exemple, comme Carl l'a fait remarquer dans sa réponse, l'exemple ci-dessus vérifie seulement que ces propriétés sont définies (suite de l'exemple dans les docs), pas qui ils sont, ils sont affectés au type attendu. Cela peut se complique avec des types nullables et objets imbriqués, c'est à vous de déterminer quel niveau de détail pour faire la forme de la vérifier.
vérifiez ceci: aliolicode.com/2016/04/23/type-checking-typescript s'il vous Plaît être à terre, vous voyez cette ligne aussi: console.journal(jean instanceof Personne); // vrai ...cheers!
Cela ne fonctionne qu'avec des instances de classe, pas d'autres types (comme les interfaces). OP mentionné
instanceof
n'ai pas de travail donc je suppose qu'il n'a pas l'instance de la classe de l'objet.Il est possible, lors du transport d'informations de type dans l'exécution de code. E. g. avec un transformateur en TS > 2.4.
OriginalL'auteur Aaron Beall
Expansion sur Aaron réponse, j'ai fait un transformateur qui génère le type de garde fonctions au moment de la compilation. De cette façon, vous n'avez pas à écrire manuellement.
Par exemple:
Vous pouvez trouver le projet ici, avec des instructions pour l'utiliser:
https://github.com/woutervh-/typescript-is
typescript-is
n'est pas bon. ils me force à utiliserttypescript
.en fait vous n'êtes pas obligé d'utiliser
ttypescript
, vous pouvez également par programmation de la compilation de votre projet avec letypescript
de l'API et de configurer les transformateurs de vous-même.ttypescript
est le recommandé, parce qu'il fait cela pour vous. Lorsque vous utilisez un transformateur vous n'avez pas d'autre choix pour le moment. Et quel est le problème avecttypescript
de toute façon? 😉oui. vous avez raison.
ttypescript
est recommandé et c'est la bonne solution. Mon avis est de savoir pour qui ne souhaite pas ajouter un autre compilateur. Si vous utiliseztypescript-is
, vous devez ajouter un autre compilateur ou d'écriture propre compilation logique. Il deviendra une autre complexité.OriginalL'auteur user7132587
J'ai été jouer avec la réponse d'Aaron et pense qu'il serait mieux de tester pour typeof au lieu de simplement pas défini, comme ceci:
OriginalL'auteur Carl Sorenson
La Fpo question était: "j'essaie de trouver un moyen de passer d'un objet à la fonction et vérifier tapez dans un moteur d'exécution".
Depuis une instance de classe est un objet de la réponse correcte est d'utiliser une instance de classe et instanceof lors de l'exécution type de vérification est nécessaire, l'utilisation de l'interface lors de pas.
Dans ma base de code, je vais généralement avoir une classe qui implémente une interface, et l'interface est utilisé lors de la compilation pour la pré-compilation de sécurité de type, tandis que les classes sont utilisées pour organiser mon code ainsi que de faire runtime type de contrôles en caractères d'imprimerie.
Fonctionne parce que routerEvent est une instance de NavigationStart classe
Ne fonctionnera pas
Ne fonctionnera pas
Comme vous pouvez le voir par le code ci-dessus, les classes sont utilisées pour comparer l'instance pour les types NavigationStart|Annuler|Erreur.
Utiliser instanceof sur un Type ou de l'Interface n'est pas possible depuis le ts compilateur retranche ces attributs lors de son processus de compilation et avant d'être interprété par JIT ou AOT. Les Classes sont un excellent moyen de créer un type qui peut être utilisé de précompilation ainsi que lors de la JS moment de l'exécution.
OriginalL'auteur Alpha G33k