Gépelt: casting HTML-elem

szavazat
143

valaki tudja, hogyan kell leadott géppel?

Próbálom ezt csinálni:

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

de ez ad nekem egy hiba:

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

Nem tudok hozzáférni a „típus” tagja a script elem, ha nem öntött el a megfelelő típusú, de nem tudom, hogyan kell ezt csinálni. kerestem a docs és minták, de nem találtam semmit.

A kérdést 02/10/2012 09:33
a forrás felhasználó
Más nyelveken...                            


12 válasz

szavazat
202

Géppel használja „<>” körülvenni vet, így a fenti válik:

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

Azonban, sajnos nem lehet csinálni:

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

Ön kap a hiba

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

De meg tudod csinálni:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Válaszolt 02/10/2012 09:47
a forrás felhasználó

szavazat
33

Mivel a géppel 0.9 a lib.d.tsfájlt, amely speciális túlterhelés aláírások vissza a megfelelő típusú hívások getElementsByTagName.

Ez azt jelenti, hogy már nem kell használni típus állításokat, hogy módosítsa a típus:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
Válaszolt 16/01/2014 00:48
a forrás felhasználó

szavazat
17

Mindig csapkod típusú rendszer segítségével:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Válaszolt 02/10/2012 20:22
a forrás felhasználó

szavazat
12

Ahhoz, hogy a végén:

  • egy tényleges Arraytárgy (nem NodeListöltözött fel, mint egy Array)
  • Egy lista, amely garantáltan csak olyan HTMLElements, nem Nodes erő-típuskonverziót HTMLElements
  • egy meleg fuzzy érzés, hogy nem a helyes út

Próbáld ezt:

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

Élvez.

Válaszolt 25/09/2015 17:37
a forrás felhasználó

szavazat
9

Csak tisztázni, ez a helyes.

Nem lehet átalakítani „NodeList” -ről „HTMLScriptElement []”

mint NodeListnem egy tényleges array (pl nem tartalmaz .forEach, .slice, .pushstb ...).

Így ha mégis konvertálni HTMLScriptElement[]a típusú rendszer, azt nem kap típusú hiba, ha próbált hívni Array.prototypetagjai rajta fordításkor, de ez nem futási időben.

Válaszolt 02/10/2012 20:19
a forrás felhasználó

szavazat
8

Ne írjon öntött. Soha. Használja típus őrök:

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.

Hagyja, hogy a fordító a munkát az Ön számára, és kap a hibák, amikor a feltételezések rossz irányba megy.

Úgy tűnhet, túlzás ebben az esetben, de ez segít sokat, ha jön vissza később, és változtassa meg a választó, mint a hozzá egy osztályt, ami hiányzik a dom, például.

Válaszolt 20/04/2017 17:18
a forrás felhasználó

szavazat
4

Ez úgy tűnik, hogy megoldja a problémát, a [index: TYPE]tömb hozzáférés típusa, egészségére.

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

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
Válaszolt 05/10/2012 09:37
a forrás felhasználó

szavazat
2

Frissítve példa:

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

Dokumentáció:

Géppel - Basic típusok - Type állításokat

Válaszolt 25/09/2018 09:58
a forrás felhasználó

szavazat
2

Meg lehet oldani a nyilatkozat fájlt (lib.d.ts) ha géppel meghatározná HTMLCollection helyett NodeList mint egy visszatérő típus.

DOM4 is meghatározza ezt a helyes visszatérési típus, de a régebbi DOM specifikáció kevésbé egyértelmű.

Lásd még http://typescript.codeplex.com/workitem/252

Válaszolt 08/11/2012 21:32
a forrás felhasználó

szavazat
1

Azt is javasoljuk a sitepen útmutatók

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (lásd alább) és https://www.sitepen.com/blog/2014/08/22/advanced -typescript-fogalmak-osztályok típusai /

Géppel is lehetővé teszi, hogy meghatározza a különböző típusú visszatérési ha a pontos szöveg van ellátva érvként a funkciót. Például géppel ambient nyilatkozat a Dom createElement módszer a következőképpen néz ki:

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

Ez azt jelenti, géppel, amikor hívja pl document.createElement ( „video”), géppel tudja a visszatérési érték egy HTMLVideoElement és képes lesz arra, hogy megbizonyosodjon róla, hogy kölcsönhatásba megfelelően a DOM Video API nélkül kell begépelnie érvényesíteni.

Válaszolt 25/08/2015 18:35
a forrás felhasználó

szavazat
1

Mivel ez egy NodeList, nem Array, akkor nem igazán lehet konzollal vagy öntés Array. Az ingatlan módja annak, hogy az első csomópont:

document.getElementsByName(id).item(0)

Akkor csak öntött, hogy:

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

Vagy meghosszabbítja NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
Válaszolt 19/12/2013 18:09
a forrás felhasználó

szavazat
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
Válaszolt 02/09/2018 13:36
a forrás felhasználó

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