키를 기반으로 클래스의 인스턴스를 반환하는 방법은 무엇입니까?

mvrlin

키를 기반으로 클래스의 인스턴스를 반환하려고하는데 클래스 사용자 지정 메서드에 액세스 할 수 없습니다.

타이프 스크립트 : 3.8.3

운동장

코드는 다음과 같습니다.

abstract class BaseProvider {
  foo!: string
}

class ProviderA extends BaseProvider {
  public testA(): string {
    return this.foo + 'a'
  }
}

class ProviderB extends BaseProvider {
  public testB(): string {
    return this.foo + 'b'
  }
}

type Provider = ProviderA | ProviderB

const providers = {
  a: ProviderA,
  b: ProviderB,
}

function useProvider<T extends keyof typeof providers>(key: T): Provider {
  const defaultProvider = providers.a
  const providerByKey = providers[key]

  if (!providerByKey) {
    console.warn(`Provider "${key}" doesn't exists.`)
    return new defaultProvider()
  }

  return new providerByKey()
}

const providerA = useProvider('a')

/**
 * Property 'testA' does not exist on type 'Provider'.
 * Property 'testA' does not exist on type 'ProviderB'.
 */
providerA.testA()

const providerB = useProvider('b')

/**
 * Property 'testB' does not exist on type 'Provider'.
 * Property 'testB' does not exist on type 'ProviderA'.
 */
providerB.testB()

나는 기대한다 :

useProvider('a')반환 new ProviderA()하고 메서드에 액세스 할 수 있습니다 testA.

useProvider('b')반환 new ProviderB()하고 메서드에 액세스 할 수 있습니다 testB.

인스턴스 대신 클래스를 반환하는 "솔루션"을 찾았지만 필요한 것은 아닙니다.

function useProvider<T extends keyof typeof providers>(key: T): typeof providers[T] {
  return providers[key]
}

const providerA = new (useProvider('a'))()
providerA.testA()
티티 안 세르 니코 바-드라고 미르

솔루션에 매우 가깝습니다 T. 반환 유형과 사이의 관계를 지정하기 만하면 됩니다. 반환 유형은 providerskey 옵션에 있는 클래스의 인스턴스 유형 T이므로InstanceType<typeof providers[T]>

유일한 문제는 InstanceType<typeof providers[T]>컴파일러가에서 반환하는 것과 동일 하다는 것이 컴파일러에 명확하지 않다는 new providerByKey()것입니다. 따라서 구현을 위해 더 관대 한 서명을 유지하면서 유형 어설 션을 사용하거나 특수 반환 유형을 전용 공용 서명으로 이동해야합니다. 내가 아래에서 한 것처럼 서명. 이 접근 방식은 유형 어설 션을 사용하지 않지만 반환하는 내용이 실제로 더 복잡한 공개 서명과 일치하는지 확인하는 것과 관련하여 사용자 자신이 있음을 의미합니다)

function useProvider<T extends keyof typeof providers>(key: T): InstanceType<typeof providers[T]>
function useProvider<T extends keyof typeof providers>(key: T): Provider {
  const defaultProvider = providers.a
  const providerByKey = providers[key]

  if (!providerByKey) {
    console.warn(`Provider "${key}" doesn't exists.`)
    return new defaultProvider()
  }

  return new providerByKey()
}

놀이터 링크

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

__new__를 사용하여 다른 클래스의 인스턴스를 기반으로 클래스를 만드는 방법은 무엇입니까?

분류에서Dev

자신의 인스턴스를 반환하는 메서드로 별칭이 지정된 클래스를 모의하는 방법은 무엇입니까?

분류에서Dev

클래스의 멤버 함수에서 클래스 인스턴스를 반환하는 방법은 무엇입니까?

분류에서Dev

Keras-하나의 인스턴스를 기반으로 예측하는 방법은 무엇입니까?

분류에서Dev

Ruby 클래스 인스턴스 변수를 다른 클래스의 새 인스턴스로 초기화하는 방법은 무엇입니까?

분류에서Dev

Java에서 일반 클래스의 인스턴스를 만드는 방법은 무엇입니까?

분류에서Dev

요소의 클래스를 반환하는 방법은 무엇입니까?

분류에서Dev

서로 의존하는 클래스를 인스턴스화하는 방법은 무엇입니까?

분류에서Dev

계약 계층 구조를 기반으로 서비스 클래스에 대한 연관을 인스턴스화하는 방법은 무엇입니까?

분류에서Dev

클래스 인스턴스를 JsonDocument로 변환하는 방법은 무엇입니까?

분류에서Dev

Angular로 클래스를 반환하는 방법은 무엇입니까?

분류에서Dev

Snowflake의 표현식을 기반으로 클러스터 키를 정의하는 방법은 무엇입니까?

분류에서Dev

비동기 함수에서 확장 약속 인스턴스를 반환하는 방법은 무엇입니까?

분류에서Dev

기본 클래스에서 부모 클래스의 인스턴스를 인쇄하는 방법은 무엇입니까?

분류에서Dev

RSpec으로 클래스 인스턴스를 두 배로 늘리는 올바른 방법은 무엇입니까?

분류에서Dev

클래스 변환기의 plainToClass :이 함수를 사용하여 일반 리터럴을 추상 클래스로 변환하는 방법은 무엇입니까?

분류에서Dev

Selenium으로 텍스트 및 클래스를 기반으로 요소를 찾는 방법은 무엇입니까?

분류에서Dev

최종 클래스를 반환하는 정적 메서드를 모의하는 방법은 무엇입니까?

분류에서Dev

JS에서 CSS 클래스를 기반으로 노드를 삽입하는 방법은 무엇입니까?

분류에서Dev

동일한 클래스의 여러 인스턴스를 비동기 적으로 실행하는 방법은 무엇입니까?

분류에서Dev

부모 * 인스턴스 *의 모든 클래스 변수를 자식 클래스로 전달하는 방법은 무엇입니까?

분류에서Dev

한 클래스의 인스턴스 메서드를 다른 클래스로 monkeypatch하는 방법은 무엇입니까?

분류에서Dev

일반적으로 클래스를 xml 노드로 변환하는 방법은 무엇입니까?

분류에서Dev

메모리에서 클래스 인스턴스 크기를 계산하는 방법은 무엇입니까?

분류에서Dev

클래스가 자신의 인스턴스를 반환하는 이유는 무엇입니까?

분류에서Dev

새로운 클래스 인스턴스를 정의 할 때라는 이름의 클래스를 반복의 점은 무엇입니까?

분류에서Dev

Dozer로 서브 클래스를 인스턴스화하는 방법은 무엇입니까?

분류에서Dev

반복되는 코드없이 클래스의 모든 인스턴스를 메모하는 방법은 무엇입니까?

분류에서Dev

메모리 할당은 참조 클래스 또는 인스턴스 클래스를 기반으로합니까?

Related 관련 기사

  1. 1

    __new__를 사용하여 다른 클래스의 인스턴스를 기반으로 클래스를 만드는 방법은 무엇입니까?

  2. 2

    자신의 인스턴스를 반환하는 메서드로 별칭이 지정된 클래스를 모의하는 방법은 무엇입니까?

  3. 3

    클래스의 멤버 함수에서 클래스 인스턴스를 반환하는 방법은 무엇입니까?

  4. 4

    Keras-하나의 인스턴스를 기반으로 예측하는 방법은 무엇입니까?

  5. 5

    Ruby 클래스 인스턴스 변수를 다른 클래스의 새 인스턴스로 초기화하는 방법은 무엇입니까?

  6. 6

    Java에서 일반 클래스의 인스턴스를 만드는 방법은 무엇입니까?

  7. 7

    요소의 클래스를 반환하는 방법은 무엇입니까?

  8. 8

    서로 의존하는 클래스를 인스턴스화하는 방법은 무엇입니까?

  9. 9

    계약 계층 구조를 기반으로 서비스 클래스에 대한 연관을 인스턴스화하는 방법은 무엇입니까?

  10. 10

    클래스 인스턴스를 JsonDocument로 변환하는 방법은 무엇입니까?

  11. 11

    Angular로 클래스를 반환하는 방법은 무엇입니까?

  12. 12

    Snowflake의 표현식을 기반으로 클러스터 키를 정의하는 방법은 무엇입니까?

  13. 13

    비동기 함수에서 확장 약속 인스턴스를 반환하는 방법은 무엇입니까?

  14. 14

    기본 클래스에서 부모 클래스의 인스턴스를 인쇄하는 방법은 무엇입니까?

  15. 15

    RSpec으로 클래스 인스턴스를 두 배로 늘리는 올바른 방법은 무엇입니까?

  16. 16

    클래스 변환기의 plainToClass :이 함수를 사용하여 일반 리터럴을 추상 클래스로 변환하는 방법은 무엇입니까?

  17. 17

    Selenium으로 텍스트 및 클래스를 기반으로 요소를 찾는 방법은 무엇입니까?

  18. 18

    최종 클래스를 반환하는 정적 메서드를 모의하는 방법은 무엇입니까?

  19. 19

    JS에서 CSS 클래스를 기반으로 노드를 삽입하는 방법은 무엇입니까?

  20. 20

    동일한 클래스의 여러 인스턴스를 비동기 적으로 실행하는 방법은 무엇입니까?

  21. 21

    부모 * 인스턴스 *의 모든 클래스 변수를 자식 클래스로 전달하는 방법은 무엇입니까?

  22. 22

    한 클래스의 인스턴스 메서드를 다른 클래스로 monkeypatch하는 방법은 무엇입니까?

  23. 23

    일반적으로 클래스를 xml 노드로 변환하는 방법은 무엇입니까?

  24. 24

    메모리에서 클래스 인스턴스 크기를 계산하는 방법은 무엇입니까?

  25. 25

    클래스가 자신의 인스턴스를 반환하는 이유는 무엇입니까?

  26. 26

    새로운 클래스 인스턴스를 정의 할 때라는 이름의 클래스를 반복의 점은 무엇입니까?

  27. 27

    Dozer로 서브 클래스를 인스턴스화하는 방법은 무엇입니까?

  28. 28

    반복되는 코드없이 클래스의 모든 인스턴스를 메모하는 방법은 무엇입니까?

  29. 29

    메모리 할당은 참조 클래스 또는 인스턴스 클래스를 기반으로합니까?

뜨겁다태그

보관