TypeScript에서 제한된 제네릭 유형의 인스턴스를 인스턴스화하는 방법이 있습니까?

Tylermmorton

Google 권장 사항을 모두 다 써 버렸기 때문에오고 있습니다. 정적으로 입력 된 요청과 응답을 처리 할 웹 소켓 시스템을 만들려고합니다.

다른 프로젝트에서 요청 / 응답 유형을 생성하고 있습니다. 두 가지 기본 유형 ( RequestDataResponseData)과 사용자가 새 요청을 보내려고 할 때 상호 작용할 "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);
    }
}
jcalz

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>BazBaznewname"Fred"foo.thisIsTheError()BazthisIstheError()baryell()

좋아요, 도움이 되길 바랍니다. 행운을 빕니다!

코드 링크

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Scala에서 제네릭 유형 T의 객체를 인스턴스화 할 수 있습니까?

분류에서Dev

매개 변수화 된 유형이 계층 구조를 통과 할 때 Java에서 제네릭 유형의 인스턴스를 만드시겠습니까?

분류에서Dev

typescript에서 제네릭이있는 클래스 인스턴스를 어떻게 감지 할 수 있습니까?

분류에서Dev

Scala에서 Java 제네릭 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

분류에서Dev

가능한 제품 유형의 인스턴스를 제한하는 방법이 있습니까?

분류에서Dev

Foldable 인스턴스를 파생 할 수있는 방법을 제한하는 Foldable 유형 클래스에 대한 법칙이 있습니까?

분류에서Dev

TypeScript의 제네릭 유형에서 제네릭 유형을 추론하는 방법이 있습니까?

분류에서Dev

구체적 유형으로 객체를 인스턴스화 할 때 변수에 제네릭 유형을 사용할 수없는 이유는 무엇입니까?

분류에서Dev

Scala에서 제네릭 유형의 인스턴스를 만드시겠습니까?

분류에서Dev

제네릭 반환 유형을 사용하여 메서드에서 구체적인 클래스의 인스턴스를 반환하는 방법

분류에서Dev

제네릭으로 전달 된 인터페이스에서 특정 값의 유형을 추론하는 방법이 있습니까?

분류에서Dev

typescript의 클래스에서 인스턴스 메서드를 제외한 유형을 만드는 방법은 무엇입니까?

분류에서Dev

제네릭 형식 클래스에서 인스턴스 변수에 액세스하지 않는 이유는 무엇입니까?

분류에서Dev

변수에서 제네릭 유형 인스턴스화

분류에서Dev

Swift 3에서 제네릭 유형 AnyObject로 NSFetchedResultController를 인스턴스화 할 수 없습니다.

분류에서Dev

제네릭 유형 인스턴스화

분류에서Dev

중첩 된 제네릭 인터페이스를 준수하는 인스턴스에 대해 유형 추론이 작동하도록하는 방법은 무엇입니까?

분류에서Dev

제네릭 컬렉션에 제네릭 인터페이스의 구체적인 인스턴스를 추가 할 수 없습니다.

분류에서Dev

동일한 프로세스의 다른 인스턴스를 다른 camunda 인스턴스 (워크 스테이션)에 할당하는 방법이 있습니까?

분류에서Dev

인터페이스를 구현하는 제네릭 형식을 인스턴스화하는 Java

분류에서Dev

네트워크에서 플레이어를 인스턴스화하는 데 문제가 있습니다.

분류에서Dev

클래스의 다른 제네릭 유형의 인스턴스를 반환하는 단일 메서드

분류에서Dev

더 제한적인 서명이있는 유형 클래스 인스턴스

분류에서Dev

인스턴스 멤버 유형이 TypeScript의 인스턴스 인터페이스와 동일한 지 확인하는 방법은 무엇입니까?

분류에서Dev

개체의 이전 인스턴스를 제거하고 루프에서 새 인스턴스를 만듭니다.

분류에서Dev

파이썬의 목록에서 객체의 인스턴스를 제거하는 방법은 무엇입니까?

분류에서Dev

제한된 반환 유형이있는 유형 클래스 인스턴스

분류에서Dev

Java에서 제네릭 유형의 인스턴스에서 getClass를 호출 할 때 원시 유형을 피하려면 어떻게해야합니까?

분류에서Dev

제네릭 유형의 인스턴스는 어떻게 생성합니까?

Related 관련 기사

  1. 1

    Scala에서 제네릭 유형 T의 객체를 인스턴스화 할 수 있습니까?

  2. 2

    매개 변수화 된 유형이 계층 구조를 통과 할 때 Java에서 제네릭 유형의 인스턴스를 만드시겠습니까?

  3. 3

    typescript에서 제네릭이있는 클래스 인스턴스를 어떻게 감지 할 수 있습니까?

  4. 4

    Scala에서 Java 제네릭 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

  5. 5

    가능한 제품 유형의 인스턴스를 제한하는 방법이 있습니까?

  6. 6

    Foldable 인스턴스를 파생 할 수있는 방법을 제한하는 Foldable 유형 클래스에 대한 법칙이 있습니까?

  7. 7

    TypeScript의 제네릭 유형에서 제네릭 유형을 추론하는 방법이 있습니까?

  8. 8

    구체적 유형으로 객체를 인스턴스화 할 때 변수에 제네릭 유형을 사용할 수없는 이유는 무엇입니까?

  9. 9

    Scala에서 제네릭 유형의 인스턴스를 만드시겠습니까?

  10. 10

    제네릭 반환 유형을 사용하여 메서드에서 구체적인 클래스의 인스턴스를 반환하는 방법

  11. 11

    제네릭으로 전달 된 인터페이스에서 특정 값의 유형을 추론하는 방법이 있습니까?

  12. 12

    typescript의 클래스에서 인스턴스 메서드를 제외한 유형을 만드는 방법은 무엇입니까?

  13. 13

    제네릭 형식 클래스에서 인스턴스 변수에 액세스하지 않는 이유는 무엇입니까?

  14. 14

    변수에서 제네릭 유형 인스턴스화

  15. 15

    Swift 3에서 제네릭 유형 AnyObject로 NSFetchedResultController를 인스턴스화 할 수 없습니다.

  16. 16

    제네릭 유형 인스턴스화

  17. 17

    중첩 된 제네릭 인터페이스를 준수하는 인스턴스에 대해 유형 추론이 작동하도록하는 방법은 무엇입니까?

  18. 18

    제네릭 컬렉션에 제네릭 인터페이스의 구체적인 인스턴스를 추가 할 수 없습니다.

  19. 19

    동일한 프로세스의 다른 인스턴스를 다른 camunda 인스턴스 (워크 스테이션)에 할당하는 방법이 있습니까?

  20. 20

    인터페이스를 구현하는 제네릭 형식을 인스턴스화하는 Java

  21. 21

    네트워크에서 플레이어를 인스턴스화하는 데 문제가 있습니다.

  22. 22

    클래스의 다른 제네릭 유형의 인스턴스를 반환하는 단일 메서드

  23. 23

    더 제한적인 서명이있는 유형 클래스 인스턴스

  24. 24

    인스턴스 멤버 유형이 TypeScript의 인스턴스 인터페이스와 동일한 지 확인하는 방법은 무엇입니까?

  25. 25

    개체의 이전 인스턴스를 제거하고 루프에서 새 인스턴스를 만듭니다.

  26. 26

    파이썬의 목록에서 객체의 인스턴스를 제거하는 방법은 무엇입니까?

  27. 27

    제한된 반환 유형이있는 유형 클래스 인스턴스

  28. 28

    Java에서 제네릭 유형의 인스턴스에서 getClass를 호출 할 때 원시 유형을 피하려면 어떻게해야합니까?

  29. 29

    제네릭 유형의 인스턴스는 어떻게 생성합니까?

뜨겁다태그

보관