2016-11-26 18 views
0

を使用して、一般的なリポジトリの作成:私は<a href="https://typeorm.github.io/index.html" rel="nofollow noreferrer">typeorm</a>を使用していると私は、一般的なリポジトリを作成したい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(); 

このコードofcurseがwoorkと名前T

を見つけることができませんfindメソッドに文句はありません

Tは自分のエンティティでなければなりませんが、これを達成する方法がわかりません

+0

何がうまくいかないのですか?実際の問題は何ですか? – toskv

+0

私は私の例を編集しましたが、現在はもっと明確になっていると思っていますが、基本的には.find(T)は名前を付けられないと文句を言うT Tは写真でなければなりません。私の一般的な方法に – user4092086

答えて

2

TypeScriptのジェネリックはコンパイルタイプのみで、ジェネリックタイプに関するすべての情報は出力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(); 

またサイドノートで、あなたはおそらく、データベースにあなたがエンティティのリストを要求するたびに接続する必要はありません。だから私はあなたのクラスを再設計することをお勧めします。

+0

この解決策を試したが、まだ文句を言わない [ts] 'T'型の引数は 'ObjectType'型のパラメータに代入できません。 タイプ 'T'は 'new()=> {}'タイプに割り当てられません。 – user4092086

+0

実際には私は注射器を使用していますが、ここに持ち込まなかった – user4092086

+0

@ user4092086私は小さな変更を加えて、それらを見てください。また、https://github.com/typeorm/typeorm-typedi-extensionsを見てください。これはあなたのコードを整理するのに役立ちます – pleerock

関連する問題