Loggfila: avstøpning HTMLElement

stemmer
152

noen som vet hvordan man skal kaste i Loggfila?

Jeg prøver å gjøre dette:

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

men det gir meg en feil:

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

Jeg får ikke tilgang til 'type' medlem av skriptet element med mindre jeg kastet den til riktig type, men jeg vet ikke hvordan du gjør dette. Jeg søkte docs og prøver, men jeg kunne ikke finne noe.

Publisert på 02/10/2012 klokken 08:33
kilden bruker
På andre språk...                            


12 svar

stemmer
210

Maskinskrevet manuskript benytter '<>' å omgi kaster, så den ovenfor blir:

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

Men dessverre kan du ikke gjøre:

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

Du får feil

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

Men du kan gjøre:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Svarte 02/10/2012 kl. 08:47
kilden bruker

stemmer
34

Per Loggfila 0,9 til lib.d.tsfilen bruker spesialiserte overbelastning signaturer som returnerer de riktige typene for samtaler til getElementsByTagName.

Dette betyr at du ikke lenger trenger å bruke typen påstander for å endre type:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
Svarte 15/01/2014 kl. 23:48
kilden bruker

stemmer
19

Du kan alltid hacke type system ved hjelp av:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Svarte 02/10/2012 kl. 19:22
kilden bruker

stemmer
12

Å ende opp med:

  • en aktuell Arraygjenstand (ikke en NodeListkledd opp som en Array)
  • en liste som er garantert å bare inkludere HTMLElements, ikke Nodes kraft-støpt til HTMLElements
  • en varm god følelse å gjøre det rette

Prøv dette:

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

Nyt.

Svarte 25/09/2015 kl. 17:37
kilden bruker

stemmer
9

Ikke skriv cast. Aldri. Bruk typen vakter:

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.

La kompilatoren gjøre jobben for deg og få feil når forutsetningene slår ut feil.

Det kan se overkill i dette tilfellet, men det vil hjelpe deg mye hvis du kommer tilbake senere og endre velgeren, som å legge en klasse som mangler i dom, for eksempel.

Svarte 20/04/2017 kl. 17:18
kilden bruker

stemmer
9

Bare for å avklare, dette er riktig.

Kan ikke konvertere 'NodeList' til 'HTMLScriptElement []

som NodeLister ikke en faktisk matrise (for eksempel den ikke inneholder .forEach, .slice, .push, etc ...).

Således hvis det gjorde konvertere til HTMLScriptElement[]i den type system, vil du få noen typen feil hvis du prøvde å ringe Array.prototypemedlemmer på det ved kompilering, men det ville svikte under kjøring.

Svarte 02/10/2012 kl. 19:19
kilden bruker

stemmer
4

Dette ser ut til å løse problemet ved hjelp av [index: TYPE]matrisen tilgangstype, jubel.

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

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
Svarte 05/10/2012 kl. 08:37
kilden bruker

stemmer
2

Oppdatert eksempel:

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

dokumentasjon:

Loggfila - Grunnleggende typer - Type påstander

Svarte 25/09/2018 kl. 09:58
kilden bruker

stemmer
2

Kan løses i erklæringen fil (lib.d.ts) hvis maskinskrevet manuskript ville definere HTMLCollection istedenfor NodeList som en returtype.

DOM4 spesifiserer også dette som den riktige returtype, men eldre DOM spesifikasjonene er mindre klar.

Se også http://typescript.codeplex.com/workitem/252

Svarte 08/11/2012 kl. 20:32
kilden bruker

stemmer
1

Jeg vil også anbefale sitepen guider

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (se nedenfor) og https://www.sitepen.com/blog/2014/08/22/advanced -typescript-konsepter-klasser-typer /

Loggfila lar deg også angi forskjellige returtyper når en eksakt strengen er gitt som et argument til en funksjon. For eksempel, Loggfila er ambient erklæring for DOM er createElement metoden ser slik ut:

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

Dette betyr i maskinskrevet manuskript, når du ringer f.eks document.createElement ( 'video'), Loggfila vet returverdien er en HTMLVideoElement og vil være i stand til å sikre at du er i samspill riktig med DOM Video API uten behov for å skrive hevde.

Svarte 25/08/2015 kl. 18:35
kilden bruker

stemmer
1

Siden det er en NodeList, ikke en Array, bør du egentlig ikke skal bruke parentes eller støping til Array. Eiendommen måten å få den første noden er:

document.getElementsByName(id).item(0)

Du kan bare kaste det:

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

Eller, forlenge NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
Svarte 19/12/2013 kl. 17:09
kilden bruker

stemmer
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
Svarte 02/09/2018 kl. 13:36
kilden bruker

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