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>
called 함수가 있습니다 send()
. 응답이 돌아 오면 응답 json을 ResponseData
유형 의 인스턴스 로 변환해야 합니다 V
. 일반 인수에서 ResponseData의 새 인스턴스를 만드는 데 문제가 있습니다 V
.
private create<R> (type: { new(): R} ) : R {
return new type();
}
^ 이것은 내가 스택 오버플로 전체에서 본 제네릭 유형을 인스턴스화하는 방법이지만이 작업을 수행 할 때 작동하지 않는 것 같습니다.
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
.Foo<V>
class Foo<V> {
constructor() {
}
create<V>(type: { new(): V} ) : V {
return new type();
}
thisIsTheError() {
let bar: V = this.create<V>(V);
}
}
TypeScript의 유형 시스템은 코드가 Javacript로 변환 될 때 지워 집니다. 런타임시, 당신은 호출 할 수 없습니다 this.create(V)
또는 new V
때문에이 V
존재하지 않습니다. (그것이 오류가 말하는 것입니다). 유형의 매개 변수를 요구하는 것에 대해 다른 곳에서 볼 수있는 솔루션 new()=>V
은 런타임에 유형의 인스턴스를 만드는 실제 생성자 객체가 필요함을 나타냅니다 V
. 그러한 생성자 객체는 마술처럼 존재하지 않습니다. 그것들 중 하나가 필요한 것은 어딘가에서 가져와야합니다. 작은 Foo
예에서 Foo
다음과 같이 생성자에 전달되어야한다고 말하고 싶습니다 .
class Foo<V> {
// pass in the V constructor here:
constructor(private ctor: new () => V) {
}
create<V>(type: { new(): V }): V {
return new type();
}
thisIsTheError() {
let bar: V = this.create(this.ctor); // okay now
return bar; // return this just to show what it does
}
}
물론 new Foo()
더 이상 전화를 걸 수 없다는 뜻 입니다.
const badFoo = new Foo(); // error, needs an argument
Foo
만들고자 하는 형식의 인수가없는 생성자를 전달해야합니다 . 예를 들면 :
class Baz {
constructor(public name: string = "Fred") { }
yell() {
console.log("HEY MY NAME IS " + this.name.toUpperCase() + "!!!")
}
}
const foo = new Foo(Baz);
const baz = foo.thisIsTheError(); // okay, type is Baz
baz.yell(); // HEY MY NAME IS FRED!!!
인수가없는 생성자 를 전달하므로 foo
유형이 유추되는 것을 볼 수 있습니다 . ( 인수없이 할 수 있습니다 ... 속성이 기본값이됩니다 .) 그런 다음 인수없이 생성자를 호출 하여 클래스 를 성공적으로 인스턴스화합니다 . 내가 만든 반환 당신이 정말 클래스 인스턴스이며,이 볼 수 있도록 값을 방법을.Foo<Baz>
Baz
Baz
new
name
"Fred"
foo.thisIsTheError()
Baz
thisIstheError()
bar
yell()
좋아요, 도움이 되길 바랍니다. 행운을 빕니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다