当前位置: 首页 > 知识库问答 >
问题:

typescript - ts 泛型引用问题?

万修然
2023-07-14

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

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()的参数有问题,想请教一下大家应该如何写?

共有4个答案

孙弘博
2023-07-14
let aa: RedisClient = {    on(event, fn) {        const redis: Events = {            ready: undefined,            error: new Error('error massage'),            reconnecting: {                attempt: 3,                delay: 300            }        }        fn(redis[event])    }}
宰子琪
2023-07-14
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(event, f): void {        switch (event) {            case 'ready':                (f as ((arg: Events["ready"]) => void))();                break            case 'error':                (f as ((arg: Events["error"]) => void))(new Error())                break            case 'reconnecting':                (f as ((arg: Events["reconnecting"]) => void))({ attempt: 1, delay: 1 })                break            default:                break        }    }}aa.on('ready', () => {    console.log(12312)})

只能这么写了

冯皓
2023-07-14
type RedisClient<T extends keyof Events> = {  on(event: T, f: (arg: Events[T]) => void): void}

只能这样改了,不然就只能强行as

曹浩
2023-07-14
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)})
 类似资料:
  • 演示代码:https://tsplay.dev/N5jo0m 从cut以上,可以看到都是正确的,问题在函数sellect 我需要根据第一个参数name: T去判断第二个参数data的类型 提供的name是fixed就限制data是FixedInstance,否则就限制为FollowInstance 问题1:我在sellect参数传参的时候故意 as FollowInstance,在TS中并没有报错

  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。

  • 我们给identity添加了类型变量。 帮助我们捕获用户传入的类型(比如:),之后我们就可以使用这个类型。 之后我们再次使用了当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。

  • 本节开始介绍 TypeScript 一些进阶知识点,第一个要介绍的泛型是 TypeScript 中非常重要的一个概念,它是一种用以增强函数、类和接口能力的非常可靠的手段。 使用泛型,我们可以轻松地将那些输入重复的代码,构建为可复用的组件,这给予了开发者创造灵活、可重用代码的能力。 1. 慕课解释 泛型在传统的面向对象语言中极为常见,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。

  • 定义一个类型 条件1:变量类型是一个字符串。 条件2:变量值不是 get "typescript": "~5.2.2"