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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:42:59