当尝试创建一个通用存储库时,我最终得到了一个如下所示的实现:
export class DynamoDbRepository<T extends IRepositoryItem> extends BaseRepository<T> {
private _tableName: string = void 0;
private _type;
constructor(tableName: string, type: new () => T) {
...
}
...
findOne(appId: string, id: string): Promise<T> {
const params = {
Key: {
"Id": id,
"AppId": appId
},
TableName: this._tableName
}
return new Promise((resolve, reject) => {
DynamoDbClient.get(params, (error, result) => {
// handle potential errors
if (error) {
Logger.error(error);
reject(new Error(`GetItemFailed for table '${this._tableName}'`));
}
// no items found
if (!result.Item) reject(new Error(`ItemNotFound in table '${this._tableName}'`));
// create instance of correct type, map properties
let item = new this._type();
Object.keys(result.Item).forEach((key) => {
item[key] = result.Item[key];
})
// return the item
resolve(item);
});
});
}
我像这样使用它,这不太理想,因为除了指定泛型类型之外,我还需要传递类名:
const userRepository = new DynamoDbRepository<User>(Tables.USERS_TABLE, User);
有没有一种解决方案,一方面更干净,又能让我返回正确的类型?
发布于 2018-08-27 00:55:58
无法基于泛型类型创建新的类实例。因为在JavaScript中代码的编译版本中没有任何类型信息,所以不能使用T
创建新对象。
您可以通过将类型传递到构造函数来以非泛型方式完成此操作-这正是您在示例中所做的事情。
有关更多详细信息,请访问此post。
https://stackoverflow.com/questions/52027828
复制相似问题