typescript - 扩展 BaseEntity 时的 typeorm 通用存储库错误
问题描述
创建通用存储库时,我在打字稿中遇到问题。我想通过强制 TEntity 泛型类型来扩展 BaseEntity 来强制键入,如下所示:
@EntityRepository()
export class ClsGEntitiesRepository<TEntity extends BaseEntity> {
private _dbConnection: Connection;
private _entity: TEntity;
constructor(entity: TEntity, dbConnection: Connection) {
this._dbConnection = dbConnection;
this._entity = entity;
}
但是,当尝试使用 getRepository 时,打字稿在将实体作为此函数的参数传递时会抱怨
错误:类型 'BaseEntity' 不可分配给类型 'string | 功能 | (新()=> TEntity)| 实体架构'。
const rootQuery = this._dbConnection
.getRepository<TEntity>(this._entity) <--error
.createQueryBuilder()
这很烦人,因为我需要传递一个字符串,它代表实体(它是一个类)的名称作为解决方法。
奇怪的是,如果我在非泛型类中使用此方法,它工作正常。正如您在下面看到的那样,实体“TestEntity”正在扩展 BaseEntity,我可以在 getRepo 中毫无问题地使用它
@Entity({
name: "testentity",
})
export class TestEntity extends BaseEntity implements ITestEntity {
@PrimaryColumn({
type: "uuid",
nullable: false,
})
resourceId: string;
@Column({
type: "float",
nullable: true,
default: 0.0,
})
value: number;
}
const a = dbConnection
.getRepository<TestEntity>(TestEntity) <--no error
.createQueryBuilder()
我在这里想念什么?
解决方案
在参数中定义实体时,我找到了使用 ObjectType 的解决方案:
@EntityRepository()
export class ClsGEntitiesRepository<
TEntity extends BaseEntity
> extends Repository<TEntity> {
private _dbConnection: Connection;
private _entityName: string;
private _entity: ObjectType<TEntity>; <--this fixed the issue
constructor(entity: ObjectType<TEntity>, dbConnection: Connection) {
super();
this._dbConnection = dbConnection;
this._entity = entity;
this._entityName = this._dbConnection.getMetadata(this._entity).name;
}
}
//example of usage
const TestEntityRepository = new ClsGEntitiesRepository<TestEntity>(
TestEntity,
getConnection()
);
但是现在我有另一个问题,类型。我创建了一个实现接口的实体。但是,我不能直接在实体中保存这个接口的对象,我必须先转换它,然后才能插入它。
我不明白为什么 TypeScript 在实体实现接口时抱怨。
要重现错误:
import { BaseEntity, Column, Entity, PrimaryColumn } from "typeorm";
interface ITest {
id: string;
val: number;
}
@Entity({
name: "theentity",
})
class TheEntity extends BaseEntity implements ITest {
@PrimaryColumn({
type: "character varying",
nullable: false,
default: "def",
})
id: string;
@Column({
type: "bigint",
nullable: true,
})
val: number;
}
const record: ITest = {
id: "id1",
val: 2,
};
const records: ITest[] = [record];
// TheEntity.save(records); <--complains
TheEntity.save(records as TheEntity[]); <--not complains and inserting fine in the table
推荐阅读
- azure - 多租户 SaaS 应用程序的身份验证
- javascript - Twitter API Javascript 扩展模式
- php - 每隔几秒刷新一次从 MYSQL 填充的 textarea
- spring-boot - 如果给定的参数集合为空,则弹簧数据 jpa 查询选择所有行
- node.js - 为 npm 注册表 URL 设置用户名和密码
- c# - C#:在表单之外获取鼠标点击位置 - 失去焦点,在外面点击后 form1 不在前面
- python - CLI 路由不适用于 @hug.extend_api()
- android - 如何在 SQLite Android Studio 中加入表
- spring - 我可以为 JMSTemplate 生产者定义 FIXED BackOff 策略吗
- knockout.js - 推送后淘汰可观察数组更改