Typescript 类型为'的参数;事件';不可分配给类型为的参数

Typescript 类型为'的参数;事件';不可分配给类型为的参数,typescript,Typescript,在typescript中这样的代码,当我尝试将事件绑定到测试对象时,它将触发错误消息,如下所示: 类型为“Events”的参数不能分配给类型为“b”|“c”的参数。 类型“a”不能分配给类型“b”|“c”。 我应该怎么做才能避免这种错误呢?e是一个'a''b''c',而不是'a',不是一个'b''c'。虽然每个值都将与其中一个重载兼容,但类型不是 您可以通过允许完整类型来修复此问题(如果您这样做,则不需要任何重载,因为它可以处理所有三种情况): 或者在调用方法上的之前缩小类型: on(event

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

类型为“Events”的参数不能分配给类型为“b”|“c”的参数。 类型“a”不能分配给类型“b”|“c”。


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

e
是一个
'a''b''c'
,而不是
'a'
,不是一个
'b''c'
。虽然每个值都将与其中一个重载兼容,但类型不是

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

或者在调用方法上的
之前缩小类型:

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

哪里是
事件
接口?。您正试图将
字符串
分配给类型
事件
我刚刚定义了
类型事件
,这还不够吗?我是typescript新手,所以我猜
const-arr:Events[]
意味着arr中的每个项目都应该是Events-type。在调用
on
方法之前,通过缩小类型似乎可以解决这个问题,但是有没有办法通过定义事件来解决这个问题?@jokcylou-我不知道在您的情况下是否可能,但以下方法可以解决:
on(事件:事件,侦听器:(stats:string)=>void)
。这意味着改变界面,而不是事件,但它使它们保持连接。是的,这会起作用。但在我的现实世界中,事件是由第三方pkg定义的,即webpack Service。因此,我没有机会改变界面。无论如何,我已经找到了原因。谢谢你的回答,很抱歉我的糟糕english@jokcylou-y我们的英语很好。
on(event: 'a' | 'b' | 'c', listener: (stats: string) => void)
type Events = 'a' | 'b' | 'c'
const arr: Events[] = ['a', 'b', 'c']
arr.forEach(e => {
    if (e === 'a') {
        test.on(e, () => { })
    } else {
        test.on(e, () => { })
    }
})