Czy ktoś wie, jak przesyłać w TypeScript?
Próbuję to zrobić:
var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);
ale daje mi błąd:
Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList
Nie mogę uzyskać dostępu do elementu „type” elementu skryptu, chyba że przerzucę go na poprawny typ, ale nie wiem, jak to zrobić. Przeszukałem dokumenty i próbki, ale nic nie znalazłem.
typescript
Gąbczasty
źródło
źródło
Odpowiedzi:
TypeScript używa „<>” do otaczania rzutów, więc powyższe staje się:
Niestety nie możesz zrobić:
Wystąpił błąd
Ale możesz zrobić:
źródło
(<NodeListOf<HTMLScriptElement>>document.getElementsByName(id))[0];
Począwszy od TypeScript 0.9,
lib.d.ts
plik używa specjalistycznych sygnatur przeciążenia, które zwracają prawidłowe typy wywołańgetElementsByTagName
.Oznacza to, że nie trzeba już używać asercji typu, aby zmienić typ:
źródło
Zawsze możesz zhakować system typu, używając:
źródło
Nie wpisuj obsady. Nigdy. Użyj osłon typu:
Pozwól kompilatorowi wykonać pracę za Ciebie i popełniaj błędy, gdy Twoje założenia okażą się błędne.
W tym przypadku może to wyglądać na przesadne, ale bardzo ci pomoże, jeśli wrócisz później i zmienisz selektor, na przykład dodając klasę, której brakuje w domenie.
źródło
Aby skończyć z:
Array
przedmiot (nieNodeList
przebrany zaArray
)HTMLElements
,Node
a nie s-casted doHTMLElement
sSpróbuj tego:
Cieszyć się.
źródło
Możemy wpisać naszą zmienną z jawnym typem zwrotu :
Lub potwierdź jako (potrzebne w TSX ):
Lub w prostszych przypadkach stwierdzaj ze składnią nawiasu kątowego .
Dokumentacja:
TypeScript - Typy podstawowe - Asercje typu
źródło
Tylko dla wyjaśnienia, to jest poprawne.
jak
NodeList
nie jest rzeczywiste array (np nie zawiera.forEach
,.slice
,.push
, etc ...).Tak więc, jeśli przekonwertowano go
HTMLScriptElement[]
na system typów, nie wystąpiłyby żadne błędy typu, gdybyś próbował wywołaćArray.prototype
na nim członków w czasie kompilacji, ale to się nie powiedzie w czasie wykonywania.źródło
To wydaje się rozwiązać problem, używając
[index: TYPE]
typu dostępu do tablicy, na zdrowie.źródło
Można rozwiązać w pliku deklaracji (lib.d.ts), jeśli TypeScript zdefiniuje HTMLCollection zamiast NodeList jako typ zwracany.
DOM4 określa również to jako poprawny typ zwrotu, ale starsze specyfikacje DOM są mniej jasne.
Zobacz także http://typescript.codeplex.com/workitem/252
źródło
Ponieważ jest to, a
NodeList
nieArray
, tak naprawdę nie powinieneś używać nawiasów ani rzutowaćArray
. Właściwym sposobem na uzyskanie pierwszego węzła jest:Możesz po prostu rzucić:
Lub przedłuż
NodeList
:źródło
const script = document.getElementsByName(id).item(0) as HTMLScriptElement;
Poleciłbym również przewodniki po sitepen
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-concept-class-types /
źródło
źródło