简单的函数重载不能按预期工作

时间:2016-07-11 15:08:39

标签: typescript

在以下代码段中:

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

1 个答案:

答案 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);
});

code in playground