首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Typescript泛型存储库模式-使用方法返回类型

Typescript泛型存储库模式-使用方法返回类型
EN

Stack Overflow用户
提问于 2018-08-26 23:43:50
回答 1查看 1.4K关注 0票数 0

当尝试创建一个通用存储库时,我最终得到了一个如下所示的实现:

代码语言:javascript
运行
复制
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);
        });
    });
}

我像这样使用它,这不太理想,因为除了指定泛型类型之外,我还需要传递类名:

代码语言:javascript
运行
复制
const userRepository = new DynamoDbRepository<User>(Tables.USERS_TABLE, User);

有没有一种解决方案,一方面更干净,又能让我返回正确的类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-27 00:55:58

无法基于泛型类型创建新的类实例。因为在JavaScript中代码的编译版本中没有任何类型信息,所以不能使用T创建新对象。

您可以通过将类型传递到构造函数来以非泛型方式完成此操作-这正是您在示例中所做的事情。

有关更多详细信息,请访问此post

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52027828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档