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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:15:03