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
相关产品推荐
相关产品推荐

