#独家
vue3+ts报错:A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556)?

2023-06-28 0 2,115

问题:ts报错
A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556)
(parameter) rest: Parameters<KeyMap[K]>

代码:

<script lang="ts" setup>

type KeyMap = {
    loading: () => unknown
    play: (duration: number) => unknown
}

type EmitsType = {
    [K in keyof KeyMap]: Parameters<KeyMap[K]>
}

const emit = defineEmits<EmitsType>()

const handleEmit = <K extends keyof KeyMap>(event: K, ...rest: Parameters<KeyMap[K]>) => {
    emit(event, ...rest)
}
</script>

vue版本 3.3.4, node环境 16.13.0 vscode/ts版本 5.1.3 volar版本:1.8.2

看了下你的代码没问题,这是typescript不兼容导致的,升级 TypeScript 版本到最新,或者考虑不使用展开操作符,而是将参数直接传递给 emit() 函数即可。例如这样:

const emit = defineEmits<EmitsType>()

const handleEmit = <K extends keyof KeyMap>(event: K, ...rest: Parameters<KeyMap[K]>) => {
    emit(event, rest)
}

个人认为升级版本的解决方法最容易。

_

更新一下这个回答:
Parameters<KeyMap[K]>改为元组类型,或者将...rest传递给rest参数试试。具体代码如下:

const handleEmit = <K extends keyof KeyMap>(event: K, ...rest: Parameters<KeyMap[K]>[]) => {
    emit(event, ...rest)
}

或者:

const handleEmit = <K extends keyof KeyMap>(event: K, rest: Parameters<KeyMap[K]>) => {
    emit(event, rest)
}
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 vue3+ts报错:A spread argument must either have a tuple type or be passed to a rest parameter.ts(2556)? https://www.jkxiazai.com/1888.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务