在以下代码段中:
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将引发编译错误,因为它仅存在于Element类型上。
如何解决这个问题?
采用NodeList | HTMLCollection
的论证不会做,因为我会失去输入和输出之间的严格关系。
也许强迫签名一直都是错误的,但是,我怎么能有重载函数?
这是使用typescript 1.8.10
答案 0 :(得分: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);
});