В следующем фрагменте:Простая функция перегрузки не работает, как ожидалось
interface ToArraySignature {
(nodeList: NodeList): Array<Node>
(collection: HTMLCollection): Array<Element>
}
const toArray: ToArraySignature = <ToArraySignature>(arrayLike: any) => {
return [].slice.call(arrayLike)
}
toArray(document.body.children).forEach(element => {
console.log(element.scrollTop)
})
ToArray будет всегда вывода первой подписи, определенной в интерфейсе. Таким образом, здесь он выведет NodeList, хотя он действительно передается HTMLCollection. Таким образом, element.scrollTop вызовет ошибку компиляции, поскольку она существует только в типе элемента.
Как это можно исправить?
Принимать аргумент NodeList | HTMLCollection
не будет, потому что я потеряю строгую связь между входом и выходом.
Возможно, заставляя подписи ошибаться все время, но тогда, как я могу перегружать функции?
Это использование машинописный 1.8.10
Ааааа, старый добрый утиной типизации; это прекрасно! – AlexG