Typescript 从扩展泛型访问属性的类型
请考虑以下设置: genericModel.tsTypescript 从扩展泛型访问属性的类型,typescript,generics,Typescript,Generics,请考虑以下设置: genericModel.ts 导出默认类GenericModel{ id!:TModelId; 构造函数(默认ID:any){ this.id=defaultId; } } genericStore.ts 类GenericStore{ @observable loadedModels=observable.map(); 建造商(服务:TService){ 服务=服务; } } 导出默认的GenericStore; 我知道你们不能在泛型上调用typeof,这只是为了说明意图
导出默认类GenericModel{
id!:TModelId;
构造函数(默认ID:any){
this.id=defaultId;
}
}
genericStore.ts
类GenericStore{
@observable loadedModels=observable.map();
建造商(服务:TService){
服务=服务;
}
}
导出默认的GenericStore;
我知道你们不能在泛型上调用typeof,这只是为了说明意图。可观察的装饰器来自mobx,但它只是一个独特的结构,需要将模型id的类型用作标识符,并且需要模型类型本身。现在我知道我可以这样做:
class GenericStore<TModelId, TModel extends GenericModel<TModelId, any>, TService> {
@observable loadedModels = observable.map<TModelId, TModel>();
constructor(service: TService){
this.service = service;
}
}
export default GenericStore;
类GenericStore{
@observable loadedModels=observable.map();
建造商(服务:TService){
服务=服务;
}
}
导出默认的GenericStore;
但是当我扩展泛型存储时,模型的类型已经声明,所以我认为应该有一种方法可以推断它,而不必显式声明TModelId。我是泛型新手,所以这可能是不可能的,但如果是这样的话,我只想确认一下。我认为TModel[“id”]
是您需要的。完整示例:
class GenericModel<ID> {
constructor(public id: ID) { }
}
class GenericStore<TModel extends GenericModel<any>> {
public aaa!: TModel["id"];
}
const store1 = new GenericStore<GenericModel<number>>();
store1.aaa; // number
类GenericModel{
构造函数(公共id:id){}
}
类泛型存储{
公共aaa!:TModel[“id”];
}
const store1=新的GenericStore();
store1.aaa;//数
class GenericStore<TModelId, TModel extends GenericModel<TModelId, any>, TService> {
@observable loadedModels = observable.map<TModelId, TModel>();
constructor(service: TService){
this.service = service;
}
}
export default GenericStore;
class GenericModel<ID> {
constructor(public id: ID) { }
}
class GenericStore<TModel extends GenericModel<any>> {
public aaa!: TModel["id"];
}
const store1 = new GenericStore<GenericModel<number>>();
store1.aaa; // number