ts 泛型引用问题?
今天面试遇到一道题,想了很久也没有想出来
type Events = {
ready: void
error: Error
reconnecting: { attempt: number; delay: number }
}
type RedisClient = {
on<T extends keyof Events>(event: T, f: (arg: Events[T]) => void): void
}
let aa: RedisClient =
这里要怎么写
aa.on('ready', () => {
console.log(12312)
})
我是这样写的,但是报错了
let aa: RedisClient = {
on: function (event, f): void {
switch (event) {
case 'ready':
f()
break
case 'error':
f(new Error())
break
case 'reconnecting':
f({ attemp: 1, delay: 1 })
break
default:
break
}
}
}
f()的参数有问题,想请教一下大家应该如何写?
回复
1个回答

test
2024-06-30
type Events = {
ready: void
error: Error
reconnecting: { attempt: number; delay: number }
}
type RedisClient = {
on<T extends keyof Events>(event: T, f: (arg: Events[T]) => void): void
}
let aa: RedisClient = {
on: function<T extends keyof Events> (event: T, f: (arg: Events[T]) => void): void {
switch (event) {
case 'ready':
f(undefined as Events[T]); // 无参数
break;
case 'error':
f(new Error() as Events[T]); // Error参数
break;
case 'reconnecting':
f({ attempt: 1, delay: 1 } as Events[T]); // 对象参数
break;
default:
break;
}
}
}
aa.on('ready', () => {
console.log('Ready event')
})
aa.on('error', (e: Error) => {
console.log('Error event', e)
})
aa.on('reconnecting', (arg: { attempt: number; delay: number }) => {
console.log('Reconnecting event', arg.attempt, arg.delay)
})
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容