Я иду к вам, потому что исчерпал все рекомендации Google. Я пытаюсь создать систему веб-сокетов, которая будет обрабатывать статически типизированные запросы и ответы.
Я генерирую типы запросов / ответов из другого проекта. У меня есть два базовых типа (RequestData
и ResponseData
) и «GenericRequest», с которым пользователь будет взаимодействовать при попытке отправить новые запросы. Пример выглядит следующим образом:
export class RequestData {}
export class ResponseData {}
export class GenericRequest<T extends RequestData, V extends ResponseData> {}
interface HandshakeResponseData extends ResponseData {
AuthCode: string;
RequestId: number; //unsigned
RedirectUrl: string;
}
interface HandshakeRequestData extends RequestData {
AuthCode: string;
RequestId: number; //unsigned
SessionToken: string;
}
export class HandshakeRequest extends GenericRequest<HandshakeRequestData, HandshakeResponseData> {}
Вот пример его использования.
new HandshakeRequest({
AuthCode: "0",
SessionToken: "<jwt>"
}).send(socket).then((data) => {
// response handler logic
});
В GenericRequest<T,V>
есть функция с именем send()
, которая отправляетзапрос выключен и ждет ответа. Когда ответ возвращается, он должен преобразовать ответ json в ResponseData
экземпляр типа V
. У меня проблемы с созданием нового экземпляра ResponseData из универсального аргумента V
:
private create<R> (type: { new(): R} ) : R {
return new type();
}
^ Это метод создания универсального типа, который я видел во всем Stack Overflow, но это немне кажется, что это не работает, когда я делаю это:
foo() : V { // where V corresponds to generic argument of GenericRequest<T,V>
return this.create<V>(V);
}
Я получаю сообщение об ошибке для параметра в скобках:
'V' only refers to a type, but is being used as a value here. ts(2693)
Вотсамый минимальный воспроизводимый образец, который я мог придумать. Я хотел бы создать новый объект V
, где V
in Foo<V>
class Foo<V> {
constructor() {
}
create<V>(type: { new(): V} ) : V {
return new type();
}
thisIsTheError() {
let bar: V = this.create<V>(V);
}
}