Maszynopis: odlewanie HTMLElement

głosy
143

ktoś wie jak rzucić na maszynie?

Próbuję to zrobić:

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

ale to daje mi błąd:

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

Nie mogę wejść do „typ” członek elementu skryptu chyba rzucę go do odpowiedniego typu, ale nie wiem jak to zrobić. Szukałem Dokumenty i próbek, ale nie mogłem znaleźć niczego.

Utwórz 02/10/2012 o 09:33
źródło użytkownik
W innych językach...                            


12 odpowiedzi

głosy
202

Maszynopis używa „<>” otoczyć odlewane, więc powyższe staje się:

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

Jednak, niestety nie można zrobić:

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

Otrzymasz błąd

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

Ale można zrobić:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Odpowiedział 02/10/2012 o 09:47
źródło użytkownik

głosy
33

Jak maszynopisu 0,9 lib.d.tsplik używa specjalistycznych podpisów przeciążenia, które zwracają poprawnych typów dla wywołań getElementsByTagName.

Oznacza to, że nie trzeba już używać typu twierdzeń zmienić typ:

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
Odpowiedział 16/01/2014 o 00:48
źródło użytkownik

głosy
17

Zawsze można włamać system typu przy użyciu:

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
Odpowiedział 02/10/2012 o 20:22
źródło użytkownik

głosy
12

Aby skończyć z:

  • rzeczywisty Arrayobiekt (nie NodeListklejony jako Array)
  • lista, która jest zagwarantowana tylko to HTMLElements, nie Nodes-force lanego do HTMLElements
  • ciepły rozmyte uczucie zrobić dobry uczynek

Spróbuj tego:

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

Cieszyć się.

Odpowiedział 25/09/2015 o 17:37
źródło użytkownik

głosy
9

Właśnie w celu wyjaśnienia, jest to prawidłowe.

nie można przekonwertować „NodeList” do „HTMLScriptElement []”

jak NodeListnie jest rzeczywiste array (np nie zawiera .forEach, .slice, .push, etc ...).

Zatem jeśli nawet przekształcić się HTMLScriptElement[]w systemie typu, można uzyskać żadnych błędów typu gdybyś spróbował zadzwonić Array.prototypeczłonków na nim w czasie kompilacji, ale to nie w czasie wykonywania.

Odpowiedział 02/10/2012 o 20:19
źródło użytkownik

głosy
8

Nie wpisuj obsady. Nigdy. Użyj strażników typu:

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.

Niech kompilator wykonać pracę dla Ciebie i pojawiają się błędy, gdy założenia okazują się błędne.

To może wyglądać przesada w tym przypadku, ale będzie Ci dużo jeśli wrócisz później i zmienić przełącznik, jak dodać klasę, której brakuje w dom, na przykład.

Odpowiedział 20/04/2017 o 17:18
źródło użytkownik

głosy
4

To wydaje się rozwiązać problem, stosując [index: TYPE]typ dostępu do tablicy, wiwaty.

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

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
Odpowiedział 05/10/2012 o 09:37
źródło użytkownik

głosy
2

Zaktualizowany przykład:

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

Dokumentacja:

Maszynopis - podstawowe typy - typ twierdzenia

Odpowiedział 25/09/2018 o 09:58
źródło użytkownik

głosy
2

Może być rozwiązany w pliku deklaracji (lib.d.ts) jeżeli maszynopis byłoby określić HTMLCollection zamiast liście węzłów jako typ zwracany.

DOM4 również określa to jako prawidłowy typ zwracany, ale starsze specyfikacji DOM są mniej jasne.

Zobacz także http://typescript.codeplex.com/workitem/252

Odpowiedział 08/11/2012 o 21:32
źródło użytkownik

głosy
1

Chciałbym również polecić sitepen prowadnice

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (patrz poniżej) i https://www.sitepen.com/blog/2014/08/22/advanced -typescript-Concepts klasy-typy /

Maszynopis pozwala także na określenie różnych typów zwracanych kiedy dokładny ciąg jest jako argument do funkcji. Na przykład deklaracja otoczenia maszynopis dla metody createElement DOM wygląda tak:

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

Oznacza to, że w maszynie, gdy dzwonisz np document.createElement ( „wideo”), maszynopis zna wartość zwracana jest HTMLVideoElement i będzie w stanie zapewnić prawidłowej jesteś interakcji z API DOM wideo bez potrzeby wpisywania assert.

Odpowiedział 25/08/2015 o 18:35
źródło użytkownik

głosy
1

Ponieważ jest to NodeList, a nie Array, to nie powinno być naprawdę za pomocą wsporników lub do rzucania Array. Nieruchomość sposób uzyskać pierwszy węzeł jest:

document.getElementsByName(id).item(0)

można po prostu rzucać, że:

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

Lub przedłużyć NodeList:

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
Odpowiedział 19/12/2013 o 18:09
źródło użytkownik

głosy
0
var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];    
Odpowiedział 02/09/2018 o 13:36
źródło użytkownik

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