Quelqu'un sait-il comment transtyper en TypeScript?
J'essaye de faire ça:
var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);
mais ça me donne une erreur:
Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList
Je ne peux pas accéder au membre «type» de l'élément de script à moins que je ne le transforme en type correct, mais je ne sais pas comment faire. J'ai cherché dans les documents et les échantillons, mais je n'ai rien trouvé.
typescript
Spongman
la source
la source
Réponses:
TypeScript utilise '<>' pour entourer les transtypages, donc ce qui précède devient:
Cependant, malheureusement, vous ne pouvez pas faire:
Vous obtenez l'erreur
Mais vous pouvez faire:
la source
(<NodeListOf<HTMLScriptElement>>document.getElementsByName(id))[0];
Depuis TypeScript 0.9, le
lib.d.ts
fichier utilise des signatures de surcharge spécialisées qui renvoient les types corrects pour les appels versgetElementsByTagName
.Cela signifie que vous n'avez plus besoin d'utiliser des assertions de type pour modifier le type:
la source
Vous pouvez toujours pirater le système de type en utilisant:
la source
Ne tapez pas cast. Jamais. Utilisez des protecteurs de type:
Laissez le compilateur faire le travail pour vous et obtenez des erreurs lorsque vos hypothèses s'avèrent erronées.
Cela peut sembler exagéré dans ce cas, mais cela vous aidera beaucoup si vous revenez plus tard et changez le sélecteur, comme l'ajout d'une classe qui manque dans le dom, par exemple.
la source
Pour finir avec:
Array
objet réel (pas unNodeList
déguisé enArray
)HTMLElements
, et non d'êtreNode
convertie de force enHTMLElement
sEssaye ça:
Prendre plaisir.
la source
Nous pourrions taper notre variable avec un type de retour explicite :
Ou affirmez comme (nécessaire avec TSX ):
Ou dans des cas plus simples, affirmez avec la syntaxe de parenthèse angulaire .
Documentation:
TypeScript - Types de base - Assertions de type
la source
Juste pour clarifier, c'est correct.
comme
NodeList
n'est pas un tableau réel (par exemple , il ne contient pas.forEach
,.slice
,.push
, etc ...).Ainsi, s'il se convertissait en
HTMLScriptElement[]
dans le système de type, vous n'obtiendrez aucune erreur de type si vous essayez d'appeler desArray.prototype
membres dessus au moment de la compilation, mais il échouera au moment de l'exécution.la source
Cela semble résoudre le problème, en utilisant le
[index: TYPE]
type d'accès au tableau, cheers.la source
Pourrait être résolu dans le fichier de déclaration (lib.d.ts) si TypeScript définissait HTMLCollection au lieu de NodeList comme type de retour.
DOM4 spécifie également cela comme type de retour correct, mais les anciennes spécifications DOM sont moins claires.
Voir aussi http://typescript.codeplex.com/workitem/252
la source
Comme c'est un
NodeList
, pas unArray
, vous ne devriez pas vraiment utiliser de parenthèses ou de castingArray
. La propriété pour obtenir le premier nœud est la suivante:Vous pouvez simplement lancer cela:
Ou étendez
NodeList
:la source
const script = document.getElementsByName(id).item(0) as HTMLScriptElement;
Je recommanderais également les guides sitepen
https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (voir ci-dessous) et https://www.sitepen.com/blog/2014/08/22/advanced -typescript-concepts-classes-types /
la source
la source