Class 类型脚本:类泛型-类似于Java';s级<;T扩展Foo>;

Class 类型脚本:类泛型-类似于Java';s级<;T扩展Foo>;,class,generics,typescript,reflection,Class,Generics,Typescript,Reflection,我有一个处理类的TypeScript代码(OGM框架) 模型/实体有一个基类,例如,BaseModel。 但是,我想支持几种不同的基本模型类,例如ProxiedBaseModel和DecoratedBaseModel 问题是: export abstract class DiscriminatorMapping<BaseModelT> { public static getMapping() : { [key: string]: typeof BaseMod

我有一个处理类的TypeScript代码(OGM框架)

模型/实体有一个基类,例如,
BaseModel
。 但是,我想支持几种不同的基本模型类,例如
ProxiedBaseModel
DecoratedBaseModel

问题是:

export abstract class DiscriminatorMapping<BaseModelT>
{
    public static getMapping() : 
        { [key: string]: typeof BaseModelT } 
    { ... }
也许我应该介绍一些类型别名

更新:我已经试过了

export abstract class DiscriminatorMapping<BaseModelClassT>
{
    public static getMapping() : { [key: string]: BaseModelClassT } { return {}; }

更新后的代码声明了从
string
BaseModelClass
实例的映射,这不是您想要的

由于无法从静态成员访问泛型约束,因此需要将静态方法本身设置为泛型:

export abstract class DiscriminatorMapping<BaseModelT> {
    public static getMapping<BaseModelT2>(): { [key: string]: { new(): BaseModelT2 } } {
      return null;
    }
}
导出抽象类应用程序{
公共静态getMapping():{[key:string]:{new():BaseModelT2}{
返回null;
}
}
()


您可以将
BaseModelT2
命名为相同的名称(没有2),但我添加了它以使其突出。

您更新的代码声明了一个从
string
BaseModelClass
实例的映射,这不是您想要的

由于无法从静态成员访问泛型约束,因此需要将静态方法本身设置为泛型:

export abstract class DiscriminatorMapping<BaseModelT> {
    public static getMapping<BaseModelT2>(): { [key: string]: { new(): BaseModelT2 } } {
      return null;
    }
}
导出抽象类应用程序{
公共静态getMapping():{[key:string]:{new():BaseModelT2}{
返回null;
}
}
()


您可以将
BaseModelT2
命名为相同的名称(没有2),但我添加它是为了让它脱颖而出。

BaseModelClass
不是一个类,它只是一个类型。我会像
DisMap
那样使用它,更好的名称应该是
TBaseModel
。在Q中更改。无论如何,要尝试,谢谢!也许正确的方法是找到其他机制,将生成的数据带到
DiscriminatorMapping
。我想要一个单例,但Angular2/SystemJS加载有问题……显然
BaseModelClass
是一个类型,但它表示一个类,它的实例就是这个映射的值。我很确定我发布的代码回答了你的问题不不,地图的值就是类。我正在将字符串映射到类型。在Java中,它应该是
Map
。但是由于TS没有类的等价物,我需要为它使用泛型类型,并在某个地方为它提供ProxiedBaseModel的类型。我知道它们是类!但是您编写它的方式就像在java中一样:
Map
,这就是我的观点。我提出的代码就是你要找的。你试过了吗?
BaseModelClass
不是一个类,它只是一种类型。我会像
DisMap
那样使用它,更好的名称应该是
TBaseModel
。在Q中更改。无论如何,要尝试,谢谢!也许正确的方法是找到其他机制,将生成的数据带到
DiscriminatorMapping
。我想要一个单例,但Angular2/SystemJS加载有问题……显然
BaseModelClass
是一个类型,但它表示一个类,它的实例就是这个映射的值。我很确定我发布的代码回答了你的问题不不,地图的值就是类。我正在将字符串映射到类型。在Java中,它应该是
Map
。但是由于TS没有类的等价物,我需要为它使用泛型类型,并在某个地方为它提供ProxiedBaseModel的类型。我知道它们是类!但是您编写它的方式就像在java中一样:
Map
,这就是我的观点。我提出的代码就是你要找的。你试过了吗?
export abstract class DiscriminatorMapping<BaseModelT> {
    public static getMapping<BaseModelT2>(): { [key: string]: { new(): BaseModelT2 } } {
      return null;
    }
}