【问题标题】:TypeScript: Class generics - something like Java's Class<T extends Foo>TypeScript:类泛型 - 类似于 Java 的 Class<T extends Foo>
【发布时间】:2016-10-28 00:56:13
【问题描述】:

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

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

问题是:

export abstract class DiscriminatorMapping<BaseModelT>
{
    public static getMapping() : 
        { [key: string]: typeof BaseModelT } 
    { ... }

这是一个简单的类字典。
它需要string 类的映射。
typeof BaseModelT 显然不起作用,因为 TypeScript 不知道会输入什么类型。

我应该如何表达类类型参数接受的是类的东西?
我已经知道如何表示任何类的类型,即{ new (): &lt;any&gt; }。但我不知道如何在这里应用它:

class DiscriminatorMapping<BaseModelT extends { new (): <any> }>

也许我应该介绍一些类型别名?

更新:我试过了

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

(使用BaseModelClassT 表示它是一个类类型(“Class&lt;T&gt;”),而不是模型类型本身。) 但这是无效的:

静态成员不能引用类类型参数。

我需要它是静态的,因为生成的数据如何通过子类的同名静态字段进入静态字段的机制。

所以目前我通过使用相同的 2 个类来解决它,仅在导入方面有所不同:

import {BaseFrameModel as BaseModel} from './BaseFrameModel';
// vs.
import {BaseModel} from './BaseModel';

【问题讨论】:

    标签: class generics typescript reflection


    【解决方案1】:

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

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

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

    (code in playground)

    您可以将 BaseModelT2 命名为相同的名称(不带 2),但我添加了它以使其脱颖而出。

    【讨论】:

    • BaseModelClass 不是一个类,它只是一个类型。我会像DisMap&lt;typeof TBaseModel&gt; 一样使用它,更好的名称是TBaseModel。 Q改了。无论如何,要试试,谢谢!
    • 也许正确的做法是找到其他机制将生成的数据带到DiscriminatorMapping。我想要一个单例,但 Angular2 / SystemJS 加载存在问题...
    • 显然BaseModelClass 是一个类型,但它代表一个类,它的实例是这个映射的值。我很确定我发布的代码可以回答您要查找的内容
    • 不不,地图的值是类。我正在将字符串映射到类型。在 Java 中,它将是 Map&lt;String, Class&lt;T&gt;&gt;。但由于 TS 没有等效的 Class 类,我需要为其使用泛型类型并在某处使用 typeof ProxiedBaseModel 提供它。
    • 我知道他们是类!但是你写它的方式就像在java中一样:Map&lt;String, T&gt;,这就是我的观点。我提出的代码就是你要找的。你试过了吗?
    猜你喜欢
    • 2017-05-21
    • 2020-08-22
    • 2017-11-13
    • 2013-08-13
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多