двойное утверждение для определения класса

#typescript

#typescript

Вопрос:

У меня есть следующий интерфейс

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

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

Я хочу иметь возможность устанавливать тип свойства type и element .

так что, как DefElement<elementType> тогда G будет иметь ElementType

итак, до сих пор все работает.

Я хотел бы создать класс, и этот класс использует эти 2 интерфейса и привязанный тип. итак, я хочу иметь возможность выполнить следующий вызов

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

Итак, я сделал следующее

 export class ServiceHandler<T,G> {
}
  

при этом возникает 2 проблемы.

1) Я не могу гарантировать, что G, T соблюдают DefElement интерфейса и DefEvent

2) если я сделаю let myVar:T; тогда myVar.value , он скажет, что для типа T нет типа

Итак, я попытался сделать следующее

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

но это говорит о том, что я не могу сделать «двойной общий»

Я хотел бы использовать последнее, потому что всегда будет определено некоторое свойство, но без указания родительского интерфейса у меня будет ошибка компилятора «значение не существует»

мой вопрос в том, как я могу реализовать этот двойной g

Ответ №1:

Не на 100% ясно, что вы хотите сделать. У вас может быть два параметра типа 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>>();
}
  

Или у вас могут быть параметры типа, которые должны реализовывать взаимодействия DefElement и DefEvent :

 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}>()
  

Комментарии:

1. @Bobby из моего прочтения ваших разъяснений вы ищете второй вариант в моем ответе. Вы хотите, чтобы два параметра типа, которые ограничены для реализации интерфейсов, G extends DefElement<any> будут означать G , что они должны реализовать DefElement