首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从存储库获取模型,而不必通过尖括号指定类型

从存储库获取模型,而不必通过尖括号指定类型
EN

Stack Overflow用户
提问于 2019-06-19 17:35:38
回答 1查看 38关注 0票数 1

我想要创建一个包含许多不同模型的存储库。当从存储库获取其中一个模型时,我希望类型记录知道模型的类型,而不必手动指定它是哪种类型。

代码语言:javascript
复制
export class Repository {
    items = {};

    add<T>(name: string, item: T) {
        this.items[name] = item;
    }

    get(name: string) {
        return this.items[name];
    }
}

class BaseModel {
    insert() {}
}

class ImageModel extends BaseModel {
    displayImage() {}
}

class UserModel extends BaseModel {
    doSomething() {}
}

class DataService {
    repository: Repository = new Repository();
}

const service = new DataService();
service.repository.add<ImageModel>('image', new ImageModel());
service.repository.add<UserModel>('user', new UserModel());

const imageModel = <ImageModel>service.repository.get('image');
const userModel = <UserModel>service.repository.get('user');

imageModel.displayImage();
userModel.doSomething();

现在,当从存储库获取模型时,我说,例如,变量imageModel的类型是ImageModel,而userModel的类型是UserModel。是否有一种方法可以让编译器知道它分别是ImageModel和UserModel类型,而不必在从存储库中获得它时指定它?可能通过使用泛型和/或推断关键字?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-23 11:56:50

假设在您的存储库中,每种类型的模型都只有一个实例,那么简化代码的一种可能的方法是使用一个Map并使用构造函数作为键。正如您从下面的示例中可以看到的那样,这可以使您的代码变得更简单、更简洁。

代码语言:javascript
复制
class Repository {
    items: Map<Function, BaseModel> = new Map();

    add<T extends BaseModel>(item: T) {
        this.items.set(item.constructor, item);
    }

    get<T extends BaseModel>(type: new () => T) {
        return this.items.get(type)! as T;
    }
}

class BaseModel {
    insert() { }
}

class ImageModel extends BaseModel {
    displayImage() { }
}

class UserModel extends BaseModel {
    doSomething() { }
}

class DataService {
    repository: Repository = new Repository();
}

const service = new DataService();
service.repository.add(new ImageModel()); // Now you don't need to specify anything here
service.repository.add(new UserModel());

const imageModel = service.repository.get(ImageModel); // As simple as it can possibly be
const userModel = service.repository.get(UserModel);

imageModel.displayImage(); // It works! TypeScript knows imageModel is an ImageModel
userModel.doSomething();

如果您必须使用字符串作为键来标识模型,并且键可能会更改,那么我必须同意Aluan Haddad的观点,即您想要的是不可能的。除非关联是固定的,而且您在代码中的某个位置定义了关联,否则TypeScript不可能知道哪个键引用哪种类型。

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

https://stackoverflow.com/questions/56673143

复制
相关文章

相似问题

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