Γραφομηχανή: χύτευση HTMLElement

ψήφοι
143

Καθένας ξέρει πώς να ρίχνει στη γραφομηχανή;

Προσπαθώ να το κάνετε αυτό:

var script:HTMLScriptElement = document.getElementsByName(script)[0];
alert(script.type);

αλλά μου δίνει ένα σφάλμα:

Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList

Δεν έχω πρόσβαση στο μέλος «τύπος» του στοιχείου σενάριο αν δεν το ρίχνει στον σωστό τύπο, αλλά δεν ξέρω πώς να το κάνουμε αυτό. Έψαξα τα έγγραφα και δείγματα, αλλά δεν μπόρεσα να βρω τίποτα.

Δημοσιεύθηκε 02/10/2012 στις 09:33
πηγή χρήστη
Σε άλλες γλώσσες...                            


12 απαντήσεις

ψήφοι
202

Γραφομηχανή χρησιμοποιεί «<>» για να περιβάλλουν εκμαγεία, ώστε η παραπάνω γίνεται:

var script = <HTMLScriptElement>document.getElementsByName("script")[0];

Ωστόσο, δυστυχώς, δεν μπορείτε να κάνετε:

var script = (<HTMLScriptElement[]>document.getElementsByName(id))[0];

Μπορείτε να πάρετε το σφάλμα

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

Αλλά μπορείτε να κάνετε:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Απαντήθηκε 02/10/2012 στις 09:47
πηγή χρήστη

ψήφοι
33

Από γραφομηχανή 0,9 το lib.d.tsαρχείο χρησιμοποιεί εξειδικευμένο υπερφόρτωση υπογραφές που επιστρέφουν τους σωστούς τύπους για κλήσεις προς getElementsByTagName.

Αυτό σημαίνει ότι θα πρέπει πλέον να χρησιμοποιούν ισχυρισμούς τύπου για να αλλάξετε τον τύπο:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
Απαντήθηκε 16/01/2014 στις 00:48
πηγή χρήστη

ψήφοι
17

Μπορείτε πάντα να χαράξει σύστημα τύπου με τη χρήση:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Απαντήθηκε 02/10/2012 στις 20:22
πηγή χρήστη

ψήφοι
12

Για να καταλήξετε με:

  • ένα πραγματικό Arrayαντικείμενο (όχι NodeListντυμένος ως Array)
  • μια λίστα που είναι εγγυημένη για να περιλαμβάνει μόνο HTMLElements, δεν Nodes δύναμη-χυτό σε HTMLElements
  • ένα ζεστό fuzzy αίσθημα για να κάνει το σωστό

Δοκιμάστε αυτό:

let nodeList : NodeList = document.getElementsByTagName('script');
let elementList : Array<HTMLElement> = [];

if (nodeList) {
    for (let i = 0; i < nodeList.length; i++) {
        let node : Node = nodeList[i];

        // Make sure it's really an Element
        if (node.nodeType == Node.ELEMENT_NODE) {
            elementList.push(node as HTMLElement);
        }
    }
}

Απολαμβάνω.

Απαντήθηκε 25/09/2015 στις 17:37
πηγή χρήστη

ψήφοι
9

Ακριβώς για να διευκρινίσει, αυτό είναι σωστό.

Δεν είναι δυνατή η μετατροπή «NodeList» σε «HTMLScriptElement []»

ως NodeListδεν είναι ένα πραγματικό array (π.χ. δεν περιέχει .forEach, .slice, .push, κλπ ...).

Έτσι, αν το έκανε μετατρέψετε HTMLScriptElement[]στο σύστημα τύπο, θα παίρνατε κανένα λάθος είδος, αν προσπαθήσει να καλέσει Array.prototypeτα μέλη της σε αυτό κατά τη μεταγλώττιση, αλλά θα αποτύχει κατά το χρόνο εκτέλεσης.

Απαντήθηκε 02/10/2012 στις 20:19
πηγή χρήστη

ψήφοι
8

Μην πληκτρολογείτε καστ. Ποτέ. Χρησιμοποιήστε προφυλακτήρες τύπου:

const e = document.getElementsByName("script")[0];
if (!(e instanceof HTMLScriptElement)) 
  throw new Error(`Expected e to be an HTMLScriptElement, was ${e && e.constructor && e.constructor.name || e}`);
// locally TypeScript now types e as an HTMLScriptElement, same as if you casted it.

Αφήστε το compiler κάνει τη δουλειά για σας και να πάρετε τα λάθη όταν οι υποθέσεις σας αποδειχθούν λανθασμένες.

Μπορεί να φαίνεται υπερβολή σε αυτή την περίπτωση, αλλά αυτό θα σας βοηθήσει πολύ αν έρθει αργότερα και να αλλάξετε τον επιλογέα, όπως η προσθήκη μιας κατηγορίας που λείπει από το dom, για παράδειγμα.

Απαντήθηκε 20/04/2017 στις 17:18
πηγή χρήστη

ψήφοι
4

Αυτό φαίνεται να λύσει το πρόβλημα, χρησιμοποιώντας τον [index: TYPE]τύπο πρόσβασης πίνακα, ζητωκραυγές.

interface ScriptNodeList extends NodeList {
    [index: number]: HTMLScriptElement;
}

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
Απαντήθηκε 05/10/2012 στις 09:37
πηγή χρήστη

ψήφοι
2

Ενημερώθηκε παράδειγμα:

const script: HTMLScriptElement = document.getElementsByName(id).item(0) as HTMLScriptElement;

Απόδειξη με έγγραφα:

Γραφομηχανή - Βασικά Είδη - Τύπος ισχυρισμούς

Απαντήθηκε 25/09/2018 στις 09:58
πηγή χρήστη

ψήφοι
2

Θα μπορούσε να λυθεί με το αρχείο δήλωσης (lib.d.ts) αν γραφομηχανή θα καθορίσει HTMLCollection αντί NodeList ως ένα είδος επιστροφής.

DOM4 καθορίζει επίσης αυτό ως σωστό τύπο επιστροφής, αλλά τα μεγαλύτερα προδιαγραφές DOM είναι λιγότερο σαφείς.

Δείτε επίσης http://typescript.codeplex.com/workitem/252

Απαντήθηκε 08/11/2012 στις 21:32
πηγή χρήστη

ψήφοι
1

Θα πρότεινα επίσης τα sitepen οδηγούς

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (βλέπε παρακάτω) και https://www.sitepen.com/blog/2014/08/22/advanced -typescript-έννοιες-κατηγορίες-τύπους /

Γραφομηχανή σας επιτρέπει επίσης να ορίσετε διαφορετικούς τύπους επιστροφή, όταν η ακριβής χορδή που δίνεται ως παράμετρο σε μια συνάρτηση. Για παράδειγμα, η δήλωση του περιβάλλοντος γραφομηχανή για τη μέθοδο createElement του DOM που μοιάζει με αυτό:

createElement(tagName: 'a'): HTMLAnchorElement;
createElement(tagName: 'abbr'): HTMLElement;
createElement(tagName: 'address'): HTMLElement;
createElement(tagName: 'area'): HTMLAreaElement;
// ... etc.
createElement(tagName: string): HTMLElement;

Αυτό σημαίνει ότι, στη γραφομηχανή, όταν σας καλούν π.χ. document.createElement ( «βίντεο»), γραφομηχανή γνωρίζει η τιμή επιστροφής είναι μια HTMLVideoElement και θα είναι σε θέση να διασφαλίσετε ότι θα αλληλεπιδρούν σωστά με το API DOM βίντεο χωρίς να χρειάζεται να πληκτρολογήσετε διεκδικούν.

Απαντήθηκε 25/08/2015 στις 18:35
πηγή χρήστη

ψήφοι
1

Δεδομένου ότι είναι ένα NodeList, όχι Array, δεν θα πρέπει πραγματικά να είναι μέσα σε αγκύλες ή χύτευση σε Array. Ο τρόπος ακίνητο για να πάρει την πρώτη του κόμβου είναι:

document.getElementsByName(id).item(0)

Μπορείτε να ρίχνει ακριβώς αυτό:

var script = <HTMLScriptElement> document.getElementsByName(id).item(0)

Ή, εκτείνονται NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
Απαντήθηκε 19/12/2013 στις 18:09
πηγή χρήστη

ψήφοι
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
Απαντήθηκε 02/09/2018 στις 13:36
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more