#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