기본 클래스에서 인스턴스를 만들고 타이핑 유지

알버트 마라시

부모 클래스의 유형을 추론하기 위해 기본 클래스를 가져 오는 데 문제가 있습니다.

abstract class Record {

    //...

    static findRecord(id: number){
        // this creates will create an instance of the prototype "this"
        // prototype of "this" will equal Node later
        return new (Object.getPrototypeOf(this))(id)
    }
}

class Node extends Record {
  statements(): Array<Statement> {
     // ...
  }
}

let node = Node.findRecord(1)
// type is "any" (as findRecord doesn't infer the type as "Node", because Object.getPrototypeOf(this)) can equal anything)

node.statements() // This has no typings in vscode

레코드의 유형이 레코드를 인스턴스화하는 클래스 (이 경우 Node)라는 것을 typescript로 알고 싶습니다.

에 대한 타이핑 node을 사용할 수 Node있도록 인스턴스화 된 유형이 필요하며 .statements()코드 복제를 피하고 .NET 에서 확장되는 각 클래스에 넣어야합니다 Record.

귀여운 paiste

대답

여기 @Titian의 대답에 따라 특정 클래스 인스턴스를 설명 findRecord하는 일반 함수로 메서드 를 만들어야합니다 T. this인수를 무시 된 첫 번째 인수로 사용하면 typescript가 호출 할 때 T의 값을 기반으로 형식을 유추 할 수 있습니다 this.

abstract class MyRecord {

    constructor(id: number) {
    }

    static findRecord<T>(this: new (id: number) => T, id: number): T {
        return new this(id);
    }
}

Typescript 플레이 그라운드 링크

대체 접근법

개인적으로 나는 "상속이 나쁘다"라는 만트라를 구입했기 때문에 공유 static논리를 각 레코드 유형에 대해 생성자에 인수로 전달하여 각 레코드 유형에 대해 인스턴스화 할 수있는 별도의 클래스로 이동할 것 입니다.

class RecordFinder<T extends BaseRecord> {

    private readonly recordClass: RecordConstructor<T>;

    constructor( recordClass: RecordConstructor<T> ) {
        this.recordClass = recordClass;
    }

    find(id: number): T {
        return new this.recordClass(id);
    }
}

interface BaseRecord {
    id: number;
}

type RecordConstructor<T extends BaseRecord> = new (id: number) => T;

여기 recordClass에서는 인터페이스 기반으로 유형을 제한하고 있으므로 MyNode확장 여부는 중요 MyRecord하지 않습니다.

const nodeFinder = new RecordFinder(MyNode);

const node = nodeFinder.find(1);

Typescript 플레이 그라운드 링크

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

새 변수를 만들지 않고 다른 파일에있는 클래스의 인스턴스 만들기

분류에서Dev

테이블 인스턴스를 만들 때 sqlalchemy에서 기본 키 만들기

분류에서Dev

메타 테이블을 사용하여 lua의 기본 클래스에서 인스턴스를 만들 수 없습니다.

분류에서Dev

JavaScript에서 이전 개체를 덮어 쓰지 않고 새 개체 인스턴스 만들기

분류에서Dev

기본 클래스에 현재 클래스 기본 인스턴스 만들기

분류에서Dev

json에서 여러 파이썬 클래스 인스턴스 만들기

분류에서Dev

목록에서 이름을 가진 클래스의 인스턴스 만들기

분류에서Dev

내부 클래스는 기본 클래스의 개인 최종 메서드에 액세스 할 수 있지만 그 이유는 무엇입니까?

분류에서Dev

제한된 함수를 타입 클래스 인스턴스로 만들기

분류에서Dev

파이 게임에서 5 초가 지나갈 때마다 클래스의 인스턴스를 만들려고하지만 대신 1이 아닌 수많은 인스턴스를 만듭니다.

분류에서Dev

기존 항목을 덮어 쓰지 않고 배열 내부에 새 클래스 인스턴스 만들기

분류에서Dev

기존 항목을 덮어 쓰지 않고 배열 내부에 새 클래스 인스턴스 만들기

분류에서Dev

인터페이스를 구현하는 기본 클래스에서 파생 된 인스턴스 목록을 만드는 방법은 무엇입니까?

분류에서Dev

클래스의 인스턴스를 만들지 않고 클래스의 속성에 액세스

분류에서Dev

클래스 상수 만들기 누가 유형이있는 클래스인지

분류에서Dev

C ++에서 값 유형이 추상 클래스 인 맵 만들기

분류에서Dev

기본 키를 정의하지 않고 SQL 데이터베이스 만들기

분류에서Dev

Python에서 클래스의 여러 인스턴스 만들기

분류에서Dev

TypeScript에서 Javascript 클래스의 인스턴스 만들기

분류에서Dev

다른 클래스에서 한 클래스의 인스턴스 만들기

분류에서Dev

다른 클래스 내에서 클래스의 인스턴스 만들기

분류에서Dev

새 인스턴스를 만들지 않고 for 루프에서 클래스 필드 수정

분류에서Dev

새 인스턴스를 만들지 않고 다른 클래스에서 변수 호출 [PHP]

분류에서Dev

typescript를 사용하여 인스턴스를 만들지 않고 필드 유형 가져 오기

분류에서Dev

클래스 인스턴스에서 이벤트 핸들러 가져 오기

분류에서Dev

파이썬 for 루프에서 클래스 인스턴스를 만들고 삭제하는 방법

분류에서Dev

다른 서브 클래스를 캐스팅하기 위해 인스턴스화하지 않을 슈퍼 클래스를 만들어야합니까?

분류에서Dev

클래스의 인스턴스를 만들지 않았는데 왜 클래스에서 print (x)합니까?

분류에서Dev

인터페이스를 사용하지 않고 Mixin 만들기

Related 관련 기사

  1. 1

    새 변수를 만들지 않고 다른 파일에있는 클래스의 인스턴스 만들기

  2. 2

    테이블 인스턴스를 만들 때 sqlalchemy에서 기본 키 만들기

  3. 3

    메타 테이블을 사용하여 lua의 기본 클래스에서 인스턴스를 만들 수 없습니다.

  4. 4

    JavaScript에서 이전 개체를 덮어 쓰지 않고 새 개체 인스턴스 만들기

  5. 5

    기본 클래스에 현재 클래스 기본 인스턴스 만들기

  6. 6

    json에서 여러 파이썬 클래스 인스턴스 만들기

  7. 7

    목록에서 이름을 가진 클래스의 인스턴스 만들기

  8. 8

    내부 클래스는 기본 클래스의 개인 최종 메서드에 액세스 할 수 있지만 그 이유는 무엇입니까?

  9. 9

    제한된 함수를 타입 클래스 인스턴스로 만들기

  10. 10

    파이 게임에서 5 초가 지나갈 때마다 클래스의 인스턴스를 만들려고하지만 대신 1이 아닌 수많은 인스턴스를 만듭니다.

  11. 11

    기존 항목을 덮어 쓰지 않고 배열 내부에 새 클래스 인스턴스 만들기

  12. 12

    기존 항목을 덮어 쓰지 않고 배열 내부에 새 클래스 인스턴스 만들기

  13. 13

    인터페이스를 구현하는 기본 클래스에서 파생 된 인스턴스 목록을 만드는 방법은 무엇입니까?

  14. 14

    클래스의 인스턴스를 만들지 않고 클래스의 속성에 액세스

  15. 15

    클래스 상수 만들기 누가 유형이있는 클래스인지

  16. 16

    C ++에서 값 유형이 추상 클래스 인 맵 만들기

  17. 17

    기본 키를 정의하지 않고 SQL 데이터베이스 만들기

  18. 18

    Python에서 클래스의 여러 인스턴스 만들기

  19. 19

    TypeScript에서 Javascript 클래스의 인스턴스 만들기

  20. 20

    다른 클래스에서 한 클래스의 인스턴스 만들기

  21. 21

    다른 클래스 내에서 클래스의 인스턴스 만들기

  22. 22

    새 인스턴스를 만들지 않고 for 루프에서 클래스 필드 수정

  23. 23

    새 인스턴스를 만들지 않고 다른 클래스에서 변수 호출 [PHP]

  24. 24

    typescript를 사용하여 인스턴스를 만들지 않고 필드 유형 가져 오기

  25. 25

    클래스 인스턴스에서 이벤트 핸들러 가져 오기

  26. 26

    파이썬 for 루프에서 클래스 인스턴스를 만들고 삭제하는 방법

  27. 27

    다른 서브 클래스를 캐스팅하기 위해 인스턴스화하지 않을 슈퍼 클래스를 만들어야합니까?

  28. 28

    클래스의 인스턴스를 만들지 않았는데 왜 클래스에서 print (x)합니까?

  29. 29

    인터페이스를 사용하지 않고 Mixin 만들기

뜨겁다태그

보관