ts 泛型引用问题?

作者站长头像
站长
· 阅读数 12

今天面试遇到一道题,想了很久也没有想出来

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