在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 實(shí)際上兼容的兩個(gè)函數(shù),為什么TypeScript報(bào)錯(cuò)“沒(méi)有兼容的調(diào)用簽名”?

實(shí)際上兼容的兩個(gè)函數(shù),為什么TypeScript報(bào)錯(cuò)“沒(méi)有兼容的調(diào)用簽名”?

自己實(shí)現(xiàn)了一個(gè)縮水版的EventTarget

interface MyEventTarget {
    addEventListener: (type: string, listener: EventListener) => void
}

但如果想和原生EventTarget混合使用的話:

function test(foo: MyEventTarget | EventTarget) {
    return foo.addEventListener('click', console.log);
}

會(huì)報(bào)錯(cuò):無(wú)法調(diào)用類(lèi)型缺少調(diào)用簽名的表達(dá)式。類(lèi)型“((type: string, listener: EventListener) => void) | ((type: string, listener: EventListener | Eve...”沒(méi)有兼容的調(diào)用簽名。

clipboard.png

如果強(qiáng)行拆開(kāi)的話,卻又可以:

function test(foo: MyEventTarget | EventTarget) {
    if (foo instanceof EventTarget) {
        return foo.addEventListener('click', console.log);
    }
    else {
        return foo.addEventListener('click', console.log);
    }
}
// OK

但是實(shí)在是太丑了。

所以請(qǐng)問(wèn)一下大家:

  1. Is it a feature, or a bug?
  2. 不論是feature還是bug,類(lèi)似的情形應(yīng)該怎樣優(yōu)雅地處理?
回答
編輯回答
怣人

這是一個(gè) bug ,目前還沒(méi)有解決。

分開(kāi)來(lái)處理也是一種解決方式,或者通過(guò)繼承:

interface MyEventTarget extends EventTarget {
    addEventListener(
        type: string,
        listener: EventListener | EventListenerOrEventListenerObject,
        options?: boolean | AddEventListenerOptions
    ): void
}

function test(foo: MyEventTarget) {
    return foo.addEventListener('click', console.log);
}
2018年8月30日 00:45