Strojopisem: lití HTML prvek

hlasů
143

někdo vědět, jak se obsazení na stroji?

Snažím se to následujícím způsobem:

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

ale to mi dává chybu:

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

Nemohu přistupovat k ‚typ‘ člena skriptu elementu, pokud jsem vrci správný typ, ale já nevím, jak to udělat. Hledal jsem na Dokumenty a vzorků, ale nemohl jsem najít nic.

Položena 02/10/2012 v 09:33
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
202

Strojopisem používá ‚<>‘ obklopit odstínů, takže výše uvedené stane:

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

Bohužel však není možné provést:

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

Dostanete chybu

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

Ale můžete udělat:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Odpovězeno 02/10/2012 v 09:47
zdroj uživatelem

hlasů
33

Jak strojopisem 0.9 lib.d.tssoubor používá specializované podpisy přetížení, které vracejí správné druhy pro volání getElementsByTagName.

To znamená, že již není nutné použít typ tvrzení změnit typ:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
Odpovězeno 16/01/2014 v 00:48
zdroj uživatelem

hlasů
17

Vždycky může zaseknout typu systému pomocí:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Odpovězeno 02/10/2012 v 20:22
zdroj uživatelem

hlasů
12

Skončit s:

  • aktuální Arrayobjekt (není NodeListoblečený jako Array)
  • seznam, který je zaručeno, že budou obsahovat pouze HTMLElements, ne Nodes nuceně nanesena do HTMLElementsekund
  • teplý nejasný pocit, udělat správnou věc

Zkuste to:

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

Užívat si.

Odpovězeno 25/09/2015 v 17:37
zdroj uživatelem

hlasů
9

Jen pro upřesnění, je to správné.

Nelze převést 'NodeList' to 'HTMLScriptElement []

jako NodeListnení skutečný array (např neobsahuje .forEach, .slice, .pushatd ...).

Tak kdyby tomu tak bylo převést HTMLScriptElement[]do systému typu, měli byste mít žádné chyby typu, pokud jste se pokusili volat Array.prototypečleny na něm v době kompilace, ale to by selhat v době běhu.

Odpovězeno 02/10/2012 v 20:19
zdroj uživatelem

hlasů
8

Nezadávejte obsazení. Nikdy. Použijte, kryty:

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.

Nechat kompilátor dělat práci za vás a získat chyby při své předpoklady dopadne špatně.

To může vypadat přezbrojení v tomto případě, ale to vám pomůže hodně, když se později vrátit a změnit voliče, jako je přidání třídu, která chybí v dom, například.

Odpovězeno 20/04/2017 v 17:18
zdroj uživatelem

hlasů
4

Zdá se, že problém vyřešit, pomocí [index: TYPE]typ přístupu pole, jásot.

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

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
Odpovězeno 05/10/2012 v 09:37
zdroj uživatelem

hlasů
2

Aktualizováno příklad:

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

Dokumentace:

Strojopis - Základní typy - Typ tvrzení

Odpovězeno 25/09/2018 v 09:58
zdroj uživatelem

hlasů
2

By mohl být vyřešen v souboru prohlášení (lib.d.ts), pokud by strojopis definovat HTMLCollection namísto NodeList jako návratový typ.

DOM4 také specifikuje to jako správný typ vratné, ale starší specifikace DOM jsou méně jasné.

Viz také http://typescript.codeplex.com/workitem/252

Odpovězeno 08/11/2012 v 21:32
zdroj uživatelem

hlasů
1

Také bych doporučit sitepen vodítka

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (viz níže) a https://www.sitepen.com/blog/2014/08/22/advanced -typescript-pojmy-třídy-typy /

Strojopisem také umožňuje zadat různé typy návratové když je přesný řetězec poskytnuty jako argument funkce. Například okolní prohlášení strojopisem pro metodu createElement DOM vypadá takto:

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

To znamená, že na psacím stroji, když voláte např document.createElement ( ‚video‘), strojopisem ví, návratová hodnota je HTMLVideoElement a bude schopna zajistit si jsou vzájemně správně API DOM Video bez nutnosti zadávat assert.

Odpovězeno 25/08/2015 v 18:35
zdroj uživatelem

hlasů
1

Vzhledem k tomu, že je to NodeList, ne Array, neměli byste být opravdu pomocí konzol nebo lití Array. Vlastnost způsob, jak získat první uzel je:

document.getElementsByName(id).item(0)

Stačí si jen cast, že:

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

Nebo rozšířit NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
Odpovězeno 19/12/2013 v 18:09
zdroj uživatelem

hlasů
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
Odpovězeno 02/09/2018 v 13:36
zdroj uživatelem

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