TypeScript устанавливает тип элемента с помощью «as» для getElementsByClassName

Очень новичок в TypeScript, поэтому я уверен, что с моим кодом что-то не так.

let htmlOption: HTMLCollection = document.getElementsByClassName(OPTION_SELECTOR);
let selected: HTMLElement = htmlOption[index];
// this throws an error "Initializer type Element is not assignable to variable type HTMLElement
selected.focus();

Я почти уверен, что это связано с тем фактом, что дети HTMLCollection - это Element, а не HTMLElement. Но мне нужно было установить фокус на HTMLElement (что не разрешено на Element)

Но следующее не выдает никаких ошибок:

let htmlOption = (document.getElementsByClassName(OPTION_SELECTOR) as HTMLCollection);
let selected = (htmlOption[index] as HTMLElement);
selected.focus();

Я не понимаю, чем они отличаются. Я думал, что могу объявить переменные с помощью varName: type = Definition?


person codeNameLily    schedule 17.07.2017    source источник
comment
Использование varName: type говорит о том, что вы намерены поместить значение типа type в varName. Если вы этого не сделаете, компилятор должен пожаловаться. Использование expression as type означает, что результатом expression является type.   -  person Heretic Monkey    schedule 17.07.2017
comment
Аналогичный вопрос, который должен ответить на ваш: и-элемент   -  person Steve Land    schedule 17.07.2017
comment
@ Steveland83, хотя это и связано с чем-то, похоже, что ОП знает о разнице между HTMLElement и Element (из вопроса: Но мне нужно было сфокусироваться на HTMLElement (что не разрешено на Element)). Этот вопрос касался ввода информации, которую TypeScript добавляет к изображению.   -  person Heretic Monkey    schedule 17.07.2017
comment
@MikeMcCaughan - спасибо за быстрый ответ. Это пример того, что вы описываете? значение типа let htmlOption: string = 'Select an Option' выражение как тип let htmlOption = (document.getElementsByClassName(OPTION_SELECTOR) as HTMLCollection) ? и спасибо @ Steveland83, но я уже понимаю, что вы упомянули.   -  person codeNameLily    schedule 17.07.2017
comment
Я не уверен, что вы спрашиваете. первое утверждение в вашем комментарии гарантирует, что htmlOption всегда содержит string. Последнее заставит htmlOption содержать HTMLCollection. Вы можете заменить его на let htmlOption: HTMLCollection = document.getElementsByClassName(OPTION_SELECTOR) as HTMLCollection; или даже на let htmlOption = <HTMLCollection>document.getElementsByClassName(OPTION_SELECTOR);. Во всех трех случаях вы сообщаете компилятору, что результатом getElementsByClassName является HTMLCollection.   -  person Heretic Monkey    schedule 17.07.2017
comment
@MikeMcCaughan, спасибо. Я не понял, что "... as HTMLCollection" печатал результат выражения getElementsByClassName. Думаю, теперь я понял. Спасибо еще раз!   -  person codeNameLily    schedule 17.07.2017