You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何获取接口子类型?EventBus回调类型声明疑问

解决EventBus抽离回调的类型声明问题

首先,你可以先定义一个回调类型别名,把事件名和对应的参数类型绑定起来:

interface A {
  a: {
    x: number
    y: number
  }
  b: {
    name: string
  }
}

// 定义事件回调的类型别名,T为事件名,对应参数类型是A[T]
type EventCallback<T extends keyof A> = (ev: unknown, param: A[T]) => void;

针对特定事件的回调声明

如果你的doA是专门处理事件a的回调,直接指定类型参数为'a'即可:

// doA的类型被约束为事件'a'的回调,param会自动推断为{ x: number, y: number }
const doA: EventCallback<'a'> = (ev, param) => {
  console.log(param.x, param.y); // 类型提示正常
};

// 直接传入on函数即可
on('a', doA);

通用事件回调声明

如果需要一个能处理多个事件的通用回调,可以用泛型函数实现,TypeScript会根据传入的事件名自动推断参数类型:

// 泛型回调函数,T自动匹配事件名
function handleAnyEvent<T extends keyof A>(ev: unknown, param: A[T]) {
  if ('x' in param) {
    console.log(param.x); // 这里param类型是A['a']
  } else if ('name' in param) {
    console.log(param.name); // 这里param类型是A['b']
  }
}

// 调用时自动推断类型
on('a', handleAnyEvent);
on('b', handleAnyEvent);

另一种方式:从on函数提取类型

你也可以直接从on函数的参数类型中提取回调类型,避免重复定义:

// 提取on函数的第二个参数类型
type EventCallback<T extends keyof A> = Parameters<typeof on>[1];

// 同样可以用来声明doA
const doA: EventCallback<'a'> = (ev, param) => {
  // param类型正确
};

内容的提问来源于stack exchange,提问作者eddy_s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:17:41