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"'
我该怎么做才能避免这种错误?
答案 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, () => { })
}
})