4

我正在使用typeorm,我想创建一个通用存储库:

import "reflect-metadata";
import { DBManager } from './db-manager';
import { Photo } from './entities/Photo';
import { createConnection, Connection } from "typeorm";

class GenericRepository<T> {
private connection: DBManager;
constructor(connection: DBManager) {
    this.connection = connection;
}

public list(): T[] {
    let result: T[] = [];
    this.connection.connect().then(async  connection => {
        result = await <Promise<T[]>>(connection.entityManager.find(T));
    });
    return result;
 }
}

let genericReposity = new GenericRepository<Photo>(new DBManager());
genericReposity.list();

此代码当然不起作用,并抱怨find找不到名称的方法T

T应该是我的实体,但我不知道如何实现

4

1 回答 1

6

TypeScript 中的泛型仅在 compile-type 中,有关泛型类型的所有信息都将在输出的 javascript 代码中删除。这就是为什么它不可能做你想做的事。只有当你明确地为你的通用存储库指定一个类型时,它才有可能,例如通过构造函数:

import "reflect-metadata";
import { DBManager } from './db-manager';
import { Photo } from './entities/Photo';
import { createConnection, Connection } from "typeorm";

export type ObjectType<T> = { new (): T } | Function;

class GenericRepository<T> {
    private connection: DBManager;
    private type: ObjectType<T>;
    constructor(type: ObjectType<T>, connection: DBManager) {
        this.type = type;        
        this.connection = connection;
}

public list(): T[] {
    let result: T[] = [];
    this.connection.connect().then(async  connection => {
        result = await <Promise<T[]>>(connection.entityManager.find(this.type));
    });
    return result;
 }
}

let genericReposity = new GenericRepository(Photo, new DBManager());
genericReposity.list();

另请注意,您可能不希望每次请求实体列表时都连接到数据库。所以我建议重新设计你的课程。

于 2016-11-26T17:35:44.720 回答