Typoskript: Gießen Htmlelement

stimmen
143

Wer weiß, wie in Typoskript zu werfen?

Ich versuche, dies zu tun:

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

aber es gibt mir eine Fehlermeldung:

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

Ich kann nicht auf den ‚Typ‘ Mitglied des Script-Element, wenn ich es auf den richtigen Typ umwandeln, aber ich weiß nicht, wie dies zu tun. Ich suchte die docs & Proben, aber ich konnte nichts finden.

Veröffentlicht am 02/10/2012 um 09:33
quelle vom benutzer
In anderen Sprachen...                            


12 antworten

stimmen
202

Typoskript verwendet ‚<>‘ Abgüsse zu umgeben, so dass die oben wird:

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

Doch leider kann man nicht tun:

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

Sie erhalten den Fehler

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

Aber Sie tun können:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Beantwortet am 02/10/2012 um 09:47
quelle vom benutzer

stimmen
33

Ab Typoskript 0.9 die lib.d.tsDatei nutzt spezielle Überlastung Signaturen , die die richtigen Typen für Anrufe zurückzukehren getElementsByTagName.

Dies bedeutet, dass Sie nicht mehr Typ Behauptungen verwenden müssen, um den Typ zu ändern:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
Beantwortet am 16/01/2014 um 00:48
quelle vom benutzer

stimmen
17

Sie können jederzeit Typ-System hacken mit:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Beantwortet am 02/10/2012 um 20:22
quelle vom benutzer

stimmen
12

Um am Ende mit:

  • ein tatsächliches ArrayObjekt (nicht NodeListals verkleidet Array)
  • eine Liste, die nur dann gewährleistet ist , sind HTMLElements, nicht Nodes Kraft gegossen HTMLElements
  • ein wohlig warmes Gefühl, das Richtige zu tun

Versuche dies:

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);
        }
    }
}

Genießen.

Beantwortet am 25/09/2015 um 17:37
quelle vom benutzer

stimmen
9

Nur um zu klären, dies richtig ist.

Kann nicht konvertieren ‚NodeList‘ auf ‚HTMLScriptElement []‘

als NodeListnicht eine tatsächliche Array ist (zB es nicht enthält .forEach, .slice, .push, etc ...).

Also wenn es tut umwandeln HTMLScriptElement[]in dem Typsystem, dann würden Sie keine Art Fehler, wenn man versucht anzurufen Array.prototypeMitglieder ihm bei der Kompilierung, aber es würde zur Laufzeit fehlschlagen.

Beantwortet am 02/10/2012 um 20:19
quelle vom benutzer

stimmen
8

Geben Sie keine Guss. Noch nie. Verwenden Art Wächter:

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.

Lassen Sie den Compiler die Arbeit für Sie tun und Fehler erhalten, wenn Ihre Annahmen falsch herausstellen.

Es kann in diesem Fall aussehen treibt, aber es wird Ihnen helfen, eine Menge, wenn Sie später zurückkommen und die Wählern ändern, wie eine Klasse hinzufügen, die in dem dom, beispielsweise fehlen.

Beantwortet am 20/04/2017 um 17:18
quelle vom benutzer

stimmen
4

Dies scheint das Problem zu lösen, die mit [index: TYPE]Array - Zugriffstyp, cheers.

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

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
Beantwortet am 05/10/2012 um 09:37
quelle vom benutzer

stimmen
2

Aktualisiert Beispiel:

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

Dokumentation:

Typoskript - Grundtypen - Typ Behauptungen

Beantwortet am 25/09/2018 um 09:58
quelle vom benutzer

stimmen
2

Könnte in der Deklarationsdatei (lib.d.ts) gelöst werden, wenn Typoskript HTMLCollection statt NodeList als Rückgabetyp definieren würde.

DOM4 gibt dies auch als den richtigen Rückgabetyp, aber ältere DOM-Spezifikationen sind weniger klar.

Siehe auch http://typescript.codeplex.com/workitem/252

Beantwortet am 08/11/2012 um 21:32
quelle vom benutzer

stimmen
1

Ich würde auch die sitepen Führer empfehlen

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (siehe unten) und https://www.sitepen.com/blog/2014/08/22/advanced -typescript-Konzepte-Klassen-Typen /

Typoskript können Sie auch verschiedene Rückgabetypen angeben, wenn eine exakte Zeichenfolge als Argument an eine Funktion vorgesehen ist. Zum Beispiel sieht Typoskript der Umgebungs Erklärung für die Methode create DOM wie folgt aus:

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

Das heißt, in Typoskript, wenn Sie anrufen zB document.createElement ( ‚Video‘), Typoskript der Rückgabewert kennt ein HTMLVideoElement und wird Sie richtig sind, um sicherzustellen, der Lage sein, mit dem DOM Video-API, ohne dass assert eingeben interagieren.

Beantwortet am 25/08/2015 um 18:35
quelle vom benutzer

stimmen
1

Da es eine ist NodeList, nicht Array, sollten Sie nicht wirklich Klammern verwenden oder Gießen Array. Die Eigenschaft Art und Weise den ersten Knoten zu erhalten ist:

document.getElementsByName(id).item(0)

Sie können, dass nur Stimmen:

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

Oder verlängern NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
Beantwortet am 19/12/2013 um 18:09
quelle vom benutzer

stimmen
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
Beantwortet am 02/09/2018 um 13:36
quelle vom benutzer

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