Vue 3+;Typescript发出函数";没有与此调用匹配的重载“;即使函数名已定义。看起来秩序很重要
当我将Vue 3 emit函数与TypeScript一起使用时,发现了一条奇怪的错误消息。 要复制的示例代码:Vue 3+;Typescript发出函数";没有与此调用匹配的重载“;即使函数名已定义。看起来秩序很重要,typescript,vue.js,vue-cli,vuejs3,Typescript,Vue.js,Vue Cli,Vuejs3,当我将Vue 3 emit函数与TypeScript一起使用时,发现了一条奇怪的错误消息。 要复制的示例代码: export default defineComponent({ emits: { emit1: (payload: number) => payload, emit2: (payload: string) => payload }, methods: { ... } } 当我尝试按如下方式调用emit1时,它编译时不会出错: thi
export default defineComponent({
emits: {
emit1: (payload: number) => payload,
emit2: (payload: string) => payload
},
methods: {
...
}
}
当我尝试按如下方式调用emit1时,它编译时不会出错:
this.$emit(“emit1”,1)代码>
但如果我做了以下操作,就会出现奇怪的错误:
this.$emit(“emit1”,“test”)代码>
如果我更改发射函数的顺序,如下所示:
export default defineComponent({
emits: {
emit2: (payload: string) => payload,
emit1: (payload: number) => payload
},
methods: {
...
}
}
当然也会出现一个错误,但这个错误至少更有意义:
TS2769: No overload matches this call.
The last overload gave the following error.
Argument of type 'boolean' is not assignable to parameter of type 'number'.
由于在这两种情况下都定义了函数名,因此错误消息#1没有意义,但#2有意义
我的问题是:
- 为什么函数的顺序会对错误消息产生影响
- 是否应该/是否可以在vue中修复此问题,以使错误在这两种情况下都有意义?Mybe这也是TypeScript本身的问题吗
使用最新的Vue CLI版本时,以下是使用emit
order收到的完整错误。切换发射顺序时,仍会以相反顺序显示两条错误消息:
TS2769:没有与此调用匹配的重载。
重载1/2'(事件:“emit1”,有效负载:number):void',给出了以下错误。
类型为“test”的参数不能分配给类型为“number”的参数。
重载2/2'(事件:“emit2”,有效负载:string):void',给出了以下错误。
类型为“emit1”的参数不能分配给类型为“emit2”的参数。
这就清楚地说明了发生了什么,但是由于您只能看到其中一条消息,因此非常混乱:
- Vue正在针对所有可能匹配的
emit
条目(即重载)测试emit。方法中使用的发射名称和发射值都作为参数提供给测试函数。在这里可以看到事件
,有效负载
作为参数传递
- 对于一个重载,
事件
参数具有匹配项,但值
参数会导致类型错误。对于另一个,没有事件
匹配
TS2769: No overload matches this call.
The last overload gave the following error.
Argument of type 'boolean' is not assignable to parameter of type 'number'.