Кто-нибудь знает, как привести в TypeScript?
Я пытаюсь сделать это:
var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);
но это дает мне ошибку:
Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList
Я не могу получить доступ к элементу 'type' элемента script, если не приведу его к правильному типу, но я не знаю, как это сделать. Я искал документы и образцы, но ничего не смог найти.
typescript
Spongman
источник
источник
Ответы:
TypeScript использует «<>» для окружения приведений, поэтому вышеприведенное становится:
Однако, к сожалению, вы не можете сделать:
Вы получаете ошибку
Но вы можете сделать:
источник
(<NodeListOf<HTMLScriptElement>>document.getElementsByName(id))[0];
Начиная с TypeScript 0.9,
lib.d.ts
файл использует специальные сигнатуры перегрузки, которые возвращают правильные типы для вызововgetElementsByTagName
.Это означает, что вам больше не нужно использовать утверждения типа для изменения типа:
источник
Не печатайте литье. Никогда. Используйте охрану типа:
Пусть компилятор сделает всю работу за вас и получит ошибки, когда ваши предположения окажутся неверными.
В этом случае это может показаться излишним, но это вам очень поможет, если вы вернетесь позже и измените селектор, например, добавив класс, который отсутствует в DOM.
источник
Вы всегда можете взломать систему типов используя:
источник
В итоге:
Array
объект (неNodeList
одетый какArray
)HTMLElements
, а неNode
с силой, отлиты вHTMLElement
секПопробуй это:
Наслаждаться.
источник
Мы могли бы напечатать нашу переменную с явным типом возврата :
Или утверждать как (необходимо с TSX ):
Или в более простых случаях утверждать с синтаксисом угловых скобок .
Документация:
TypeScript - Основные типы - Утверждения типа
источник
Просто чтобы уточнить, это правильно.
как
NodeList
это не реальный массив (например , он не содержит.forEach
,.slice
,.push
и т.д. ...).Таким образом, если бы он конвертировался
HTMLScriptElement[]
в систему типов, вы бы не получили ошибок типов, если бы попытались вызвать егоArray.prototype
члены во время компиляции, но это не сработало бы во время выполнения.источник
Это, кажется, решает проблему, используя
[index: TYPE]
тип доступа к массиву, ура.источник
Может быть решен в файле декларации (lib.d.ts), если TypeScript определит HTMLCollection вместо NodeList в качестве возвращаемого типа.
DOM4 также указывает это как правильный тип возврата, но более старые спецификации DOM менее ясны.
Смотрите также http://typescript.codeplex.com/workitem/252
источник
Поскольку это, а
NodeList
не anArray
, вам не следует использовать скобки или приведение кArray
. Свойство получить первый узел:Вы можете просто разыграть это:
Или расширить
NodeList
:источник
const script = document.getElementsByName(id).item(0) as HTMLScriptElement;
Я бы также порекомендовал руководство по сайту
https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (см. ниже) и https://www.sitepen.com/blog/2014/08/22/advanced -typescript-понятия-классы-типов /
источник
источник