2016-07-11 3 views
0

В следующем фрагменте:Простая функция перегрузки не работает, как ожидалось

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

ответ

1

Я не знаю, почему он всегда использует первую подпись в этом случае, но вы даже не нужно все, что так или иначе.

Почему просто не делать этого:

function toArray<T>(arrayLike: ArrayLike<T>): T[] { 
    return [].slice.call(arrayLike); 
} 

toArray(document.body.children).forEach(element => { 
    console.log(element.scrollTop) 
}); 

toArray(document.getElementById("some_id").childNodes).forEach(node => { 
    console.log(node.nodeName); 
}); 

(code in playground)

+0

Ааааа, старый добрый утиной типизации; это прекрасно! – AlexG