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, () => { })
})
打字稿中这样的代码,当我尝试将事件绑定到测试对象时,它会触发错误消息如下:
“事件”类型的参数不能分配给“b”类型的参数 | “C”'。类型 '"a"' 不能分配给类型 '"b" | “C”'。
我应该怎么做才能避免这种错误?
解决方案
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, () => { })
}
})
推荐阅读
- typescript - TypeScript 拒绝与“类型'{} []'不可分配给类型'数字''
- powershell - 存储和重置文件的 LastModifiedDate
- python - 如何显示熊猫数据框图形的 x 轴标签
- windows - 无法获取 vim 将突出显示的文本复制到系统剪贴板,而不是 vim 的剪贴板
- linux - 如何修改行首有字符的模式
- c - 这个 memcpy 会导致未定义的行为吗?
- laravel - laravel & vuejs - 你是否正确注册了组件?对于递归组件,请确保提供“名称”选项。在发现
- r - ggplot 的每个方面都有不同的 `geom_hline()`
- dc.js - Crossfilter 使用具有嵌套对象的数据创建维度
- java - maven在哪里安装jar?