首页 > 解决方案 > “事件”类型的参数不可分配给类型参数

问题描述

interface Test {
    on(event: 'a', listener: (stats: string) => void)
    on(event: 'b' | 'c', listener: (stats: string) => void)
}

const test: Test = {
    on(event, listener) {}
}

type Events = 'a' | 'b' | 'c'
const arr: Events[] = ['a', 'b', 'c']
arr.forEach(e => {
    test.on(e, () => { })
})

打字稿中这样的代码,当我尝试将事件绑定到测试对象时,它会触发错误消息如下:

“事件”类型的参数不能分配给“b”类型的参数 | “C”'。类型 '"a"' 不能分配给类型 '"b" | “C”'。

我应该怎么做才能避免这种错误?

标签: typescript

解决方案


e是一个'a' | 'b' | 'c',不是一个'a',不是一个'b' | 'c'。尽管每个值都将与其中一个重载兼容,但类型却不是。

您可以通过允许完整类型来解决此问题(如果您这样做,则不需要任何重载,因为它可以处理所有三种情况):

on(event: 'a' | 'b' | 'c', listener: (stats: string) => void)

或者在调用方法之前缩小类型on

type Events = 'a' | 'b' | 'c'
const arr: Events[] = ['a', 'b', 'c']
arr.forEach(e => {
    if (e === 'a') {
        test.on(e, () => { })
    } else {
        test.on(e, () => { })
    }
})

推荐阅读