类型'事件'的争论不能分配给类型的参数

时间:2018-06-05 08:07:46

标签: typescript

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, () => { })
})

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

类型'事件的争论'不能分配给'" b"类型的参数。 | " C"&#39 ;.   输入'" a"'不能分配给'" b" | " C"'

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

1 个答案:

答案 0 :(得分:1)

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, () => { })
    }
})