Typescript 从扩展泛型访问属性的类型

Typescript 从扩展泛型访问属性的类型,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.ts

导出默认类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