我想要创建一个包含许多不同模型的存储库。当从存储库获取其中一个模型时,我希望类型记录知道模型的类型,而不必手动指定它是哪种类型。
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类型,而不必在从存储库中获得它时指定它?可能通过使用泛型和/或推断关键字?
发布于 2019-06-23 11:56:50
假设在您的存储库中,每种类型的模型都只有一个实例,那么简化代码的一种可能的方法是使用一个Map并使用构造函数作为键。正如您从下面的示例中可以看到的那样,这可以使您的代码变得更简单、更简洁。
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不可能知道哪个键引用哪种类型。
https://stackoverflow.com/questions/56673143
复制相似问题