如何修复TypeScript动态类型问题:Middleware泛型类型不兼容错误
问题
我定义了如下Middleware函数:
function Middleware<T extends Function>(middleware: Array<{ funcs: Array<keyof T['prototype']>, class: T }>) { } class TestValidation { Test() { } } class FilterValidation { Filter() { } }
尝试以字符串形式传入类的方法时,示例调用报错:
Middleware([ { funcs: ['Test'], class: TestValidation }, { funcs: ['Filter'], class: FilterValidation} ])
错误信息:Type "Filter" is not assignable to type 'keyof TestValidation'
修复方案
方案一:拆分泛型到单个元素类型
将泛型约束从整个函数下移到单个中间件项,让数组中的每个元素都能独立匹配对应类的方法键:
// 定义单个中间件项的泛型类型 type MiddlewareItem<T extends Function> = { funcs: Array<keyof T['prototype']>; class: T; }; // 函数接受任意符合MiddlewareItem类型的数组 function Middleware(middleware: Array<MiddlewareItem<Function>>): void { // 函数逻辑实现 } class TestValidation { Test() { } } class FilterValidation { Filter() { } } // 调用恢复正常 Middleware([ { funcs: ['Test'], class: TestValidation }, { funcs: ['Filter'], class: FilterValidation } ]);
方案二:使用映射类型实现自动推断
通过泛型数组的映射类型,让TS自动为每个数组元素推断对应类的方法键:
function Middleware<T extends Function[]>(middleware: { [K in keyof T]: { funcs: Array<keyof T[K]['prototype']>; class: T[K]; }; }): void { // 函数逻辑实现 } class TestValidation { Test() { } } class FilterValidation { Filter() { } } // 调用时TS自动匹配每个元素的类型 Middleware([ { funcs: ['Test'], class: TestValidation }, { funcs: ['Filter'], class: FilterValidation } ]);
错误原因说明
原代码中,泛型T是整个函数的约束,TS会把数组中所有class的类型合并为TestValidation | FilterValidation,而funcs被要求是这个联合类型原型键的交集——但TestValidation和FilterValidation的原型键没有重叠,导致'Filter'无法匹配keyof TestValidation,最终抛出类型错误。
修改后的写法让每个数组元素拥有独立的类型约束,TS会分别推断每个class对应的方法键,从而保证funcs的类型与对应类的方法名完全匹配。
内容的提问来源于stack exchange,提问作者Erdem Ün
相关产品推荐
相关产品推荐

