对类定义的双重声明

时间:2019-04-22 01:38:50

标签: typescript

我具有以下界面

export interface DefElement<G> {
  id: string;
  element: G;
}

export interface DefEvent<T> {
  type: T;
  value: any;
}

我希望能够设置属性typeelement的类型。

就像DefElement<elementType>一样,G将是ElementType

所以到目前为止,一切正常。

我想创建一个类,该类使用那些2接口和绑定类型。所以我希望能够进行以下呼叫

ServiceHandler<DefElement<ElementType>,DefEvent<EventType>>()

所以我做了以下

export class ServiceHandler<T,G> {
}

这样做有两个问题。

1)我不能保证G,T尊重接口DefElement和DefEvent

2)如果我让myVar:T;然后让myVar.value,它将表示类型T上没有类型

所以我尝试执行以下操作

export class ServiceHandler<DefElement<G>,DefEvent<T>> {
}

但是它说我不能做一个“双重通用”

我想使用后者,因为总会定义一些属性,但是如果不指定父接口,则会出现编译器错误“值不存在”

我的问题是我应该如何实现这个双重g

1 个答案:

答案 0 :(得分:2)

目前尚不清楚您要做什么。您可以为ServiceHandler使用两个类型参数,并可以将其用作其他类型的参数:

export interface DefElement<G> {
    id: string;
    element: G;
}

export interface DefEvent<T> {
    type: T;
    value: any;
}

export class ServiceHandler<G, T> {

    mapOfelement: Map<string, Map<string, DefElement<G>>> = new Map<string, Map<string, DefElement<G>>>();
    groupDispatchers: Map<string, DefEvent<T>> = new Map<string, DefEvent<T>>();
}

或者您可以具有必须实现DefElementDefEvent接口的类型参数:

export interface DefElement<G> {
    id: string;
    element: G;
}

export interface DefEvent<T> {
    type: T;
    value: any;
}

export class ServiceHandler<G extends DefElement<any>, T extends DefEvent<any>> {

    mapOfelement: Map<string, Map<string, G>> = new Map<string, Map<string, G>>();
    groupDispatchers: Map<string, T> = new Map<string, T>();
}

let s = new ServiceHandler<{ id: string, element: number}, { type: 'A', value: any}>()
相关问题