TypeScript泛型函数如何传入类参数解决Entity仅为类型无法用作值报错
错误原因
TypeScript 中的泛型参数是编译期特性,编译为 JavaScript 后会被完全擦除,仅做编译阶段的类型校验,不存在于运行时环境。你代码中直接将泛型参数Entity作为值传给findOneOrFail方法,运行时找不到对应的变量,就会触发该报错。
解决方案
你需要把实体类作为运行时参数传入函数,同时用泛型绑定实体类型,既保证运行时有可访问的类实体,又能保留完整的类型提示。
代码实现(适配TypeORM场景):
// 导入TypeORM内置的实体类型约束,也可以自定义通用构造函数类型 import { EntityTarget } from "typeorm"; // 泛型T对应实体类型,第一个参数接收运行时可用的实体类 const check = async <T>(entityClass: EntityTarget<T>) => { if (ObjectUtil.areChanged(memberUser.client, data, 'employmentTypeId')) { // 传入实体类变量而非泛型参数 const beforeEmploymentType = await manager.findOneOrFail(entityClass, memberUser.client.employmentTypeId); const afterEmploymentType = await manager.findOneOrFail(EmploymentType, data.employmentTypeId); } }
调用方式:
直接将对应实体类作为参数传入即可,泛型会自动推导类型:
// 例如要查询User实体,就传入User类 await check(User);
通用场景(不绑定特定ORM)的写法:
如果需要适配任意类参数,可以自定义构造函数类型约束:
// 通用构造函数类型 type Constructor<T = any> = new (...args: any[]) => T; const check = async <T>(entityClass: Constructor<T>) => { // 内部逻辑和上面一致 }
内容的提问来源于stack exchange,提问作者Daniyar Changylov
相关产品推荐
相关产品推荐

