类继承时如何传递动态泛型参数?
类继承时如何传递动态泛型参数?
我看你这段代码里,应该是想让Child类继承Base的时候,既自带固定的ChildType事件类型,又能支持外部传入动态的Events泛型扩展,但调用print方法时类型提示或者行为不符合预期对吧?
咱们先理清楚问题:Base类的泛型设计是支持自定义事件字典的,而Child类的需求是“固定事件+动态扩展事件”,那关键就是在继承的时候把这两类事件正确合并后传递给Base的泛型参数,同时保持类型推断的正确性。
先看修正后的完整代码,我给你标清楚调整的地方:
type Dict = Record<string, unknown> class Base< Events extends Dict = Dict, Types extends keyof Events = keyof Events > { events?: Events print<T extends Types>(key: T, value: Events[T]): void { // 可以加个简单实现,方便测试 console.log(`触发事件 ${String(key)}:`, value); } } type ChildType = { count: number } // 核心调整:让Child的泛型Events默认值为Dict,继承Base时传入「固定类型+动态泛型」的交叉类型 class Child<Events extends Dict = Dict> extends Base<ChildType & Events> { test() { // 现在调用print完全符合预期了 this.print('count', 123); // 固定的count事件,类型匹配number // 如果实例化时传入扩展的事件类型,也能正确识别 // 比如 const child = new Child<{ nickname: string }>(); // child.print('nickname', '小渔'); // 类型提示会自动识别string } }
为什么要这么写呢?我给你拆解下:
- 首先给Child的泛型参数
Events加了默认值Dict,这样你不需要扩展事件的时候,直接new Child()就能用,不用额外传泛型参数。 - 继承Base的时候,把
ChildType & Events作为父类的Events泛型参数,这样Base类就能识别到所有事件:既有固定的count,又有你动态传入的其他事件。 - 这样一来,不管是在Child类内部的test方法里,还是外部实例化时调用print,TypeScript都会给你正确的类型提示,不会出现类型不匹配的问题。
再给你举个外部扩展的实际例子,你一看就懂:
// 只使用固定事件的场景 const basicChild = new Child(); basicChild.print('count', 456); // 正常打印,类型完全匹配 // 扩展额外事件的场景 const extendedChild = new Child<{ username: string; age: number }>(); extendedChild.print('count', 789); // 依然支持固定的count事件 extendedChild.print('username', 'zhangfisher'); // 扩展的string类型事件 extendedChild.print('age', 28); // 扩展的number类型事件
这样调整后,就能完美实现你想要的“固定基础事件+动态泛型扩展”的需求,类继承时的泛型传递也清晰明了。
备注:内容来源于stack exchange,提问作者zhangfisher
相关产品推荐
相关产品推荐

