TypeScript:类泛型 - 类似Java的类<t extends =“”foo =“”>

时间:2016-10-28 00:56:14

标签: class generics typescript reflection

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

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

问题是:

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

这是一个简单的字典类 它需要string&lt; - &gt;的地图。类。
并且typeof BaseModelT显然不起作用,因为TypeScript无法知道将会出现什么类型。

我应该如何表达类类型参数需要一个类?
我已经知道如何表示任何类的类型,{ new (): <any> }。但我不知道如何在这里应用它:

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

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

更新:我试过

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

(使用BaseModelClassT来表达类型(&#34; Class<T>&#34;),而不是模型类型本身。) 但这是无效的:

  

静态成员无法引用类类型参数。

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

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

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

1 个答案:

答案 0 :(得分:2)

您的更新代码声明了从DispatchQueue.main.async { self.player.play() } string实例的映射,但并不是您想要的。

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

BaseModelClass

code in playground

您可以将export abstract class DiscriminatorMapping<BaseModelT> { public static getMapping<BaseModelT2>(): { [key: string]: { new(): BaseModelT2 } } { return null; } } 命名为相同(不含2),但我添加它以使其脱颖而出。