Tapuscrit et dot-notation aux objets
Si Tapuscrit est un strict sur-ensemble de JavaScript, pourquoi la notation point sur un objet arbitraire erronée? J'ai du code JS que je veux les convertir en TS pour une meilleure sécurité de type, mais tous les accès à l'aide de la notation de point (par exemple, myObj.thing
) me donne l'erreur Property 'thing' does not exist on type '{}'.
. Il fonctionne correctement lorsque j'utilise le support de la notation (par exemple, myObj['thing']
).
- C'est un avertissement, il convient toutefois de compiler, de sorte Tapuscrit est toujours un sur-ensemble strict de JS. La raison pour laquelle il est d'avertissement vous c'est parce que la Machine est tapé, et le type de
x
ne précise pasbar
propriétés. Vous pouvez soit jeté àany
, appliquer une interface qui n'ontbar
, ou de l'utilisation["bar"]
. - L'erreur affichée & décrit est signalé comme une erreur bon, pas un avertissement, et mon échec de la construction. Cependant, je suis en mesure de lancer pour
any
avec succès. - Tapuscrit est intentionnellement plus strictes que JavaScript, afin de l'avoir à l'être juridique en Javascript ne signifie pas nécessairement le Tapuscrit compilateur sera d'accord.
Vous devez vous connecter pour publier un commentaire.
Je sais vous dire que c'est bizarre, mais c'est l'une des principales raisons Tapuscrit existe. Cette erreur permet d'éviter tout réglage ou d'obtenir inexistante propriétés d'un objet.
Dès maintenant, alors que le compilateur te dit, la propriété
bar
n'existe pas surx
parce qu'il a été implicitement tapé à{}
lors de l'écriture devar x = {};
.Vous pouvez indiquer au compilateur que
x
a plus de zéro propriétés explicitement à la définition du type:Maintenant vous pouvez obtenir ou de définir
x.foo
etx.bar
sans le compilateur se plaindre. Dans la plupart des cas, vous déplacer dans une interface comme ceci:Certaines personnes recommandent de lancer pour
any
, mais ne soyez pas paresseux. Vous devez utiliser pleinement le système de type texte dactylographié fournit. Le faire sera très certainement vous faire économiser du temps en bas de la route que vous maintenez une application.En raison de fortement typées nature du Tapuscrit de l'Objet, vous pouvez utiliser le bouton "tout" pour en faire non typé:
Si ce que vous avez besoin est de définir le type de littéral propriétés
puis
x["bar"]
ne peuvent désormais plus être instance de TypeA.x
ne détient aucun bien nommébar
si vous avez besoin de créer à l'intérieur de l'objet:any
(comme @Asad décrit ci-dessus).mwilson y est arrivé avant que je le pouvais! 😉
Dans le code ci-dessus, Tapuscrit est pas en mesure de déterminer que l'objet
x
expose une propriété appeléebar
ne peut donc pas résoudre lors de l'affichage de l'Intellisense.Au lieu de cela, ajouter
foo
,bar
, etc. en tant que propriétés de l'objet lui-même:Ensuite, lors de l'utilisation de la Tapuscrit De L'Aire De Jeux, vous allez voir l'Intellisense fonctionne comme prévu:
HTH
Personnellement, je préfère préciser les types à chaque fois que j'ai de la chance.
Note, que vous ne pouvez instancier cette variable avec
{}
si vous définissez les champs facultatifs avec le?:
opérateur.Comme d'autres l'ont dit, si vous prévoyez d'utiliser ce type à plusieurs reprises, il est probablement mieux de le faire explicitement classe.
PS: il est préférable d'utiliser
let
au lieu devar
lors de la programmation en texte dactylographié. (par exemple, la portée d'unevar
déclaration est un peu bizarre, par rapport à unlet
à ce que vous vous attendez à faire).