Машинопись: экземпляр типа класса - PullRequest
1 голос
/ 06 мая 2020

У меня есть тип такого класса, как здесь A_Type?

class A {
  constructor(public a: string) {}
}

type A_Type = {new (a: string): A}

И я хотел бы получить тип экземпляра конструктора A_Type, чтобы я мог ввести эту функцию явно

class A {
  constructor(public a: number) {}
}
//                                              ** not working **
function f<W extends { new(a: number): A }>(e: W): instanceof W {
  return new e(2)
}

let w = f(A)

Я в основном ищу обратную операцию typeof в машинописном тексте.

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Я бы сделал go следующим образом:

type Constructor<X> = {new (a: number): X}

function f<X>(e: Constructor<X>): X {
  return new e(2)
}

const w = f(A)
1 голос
/ 06 мая 2020

Для этого можно использовать встроенную утилиту InstanceType<T>

class A {
    constructor(public a: number) { }
}

// declare that the return value of the class constructor returns an instance of that class
function f<W extends { new(a: number): InstanceType<W> }>(e: W) {
    return new e(2) // return type is automatically inferred to be InstanceType<W>
}

let w = f(A) // w: A

Ссылка на игровую площадку

1 голос
/ 06 мая 2020
function f<W extends { new(a: number): any }, R extends W extends { new(a: number): infer U } ? U : never>(e: W): R {
  return new e(2)
}

вам нужно использовать дженерики для извлечения возвращаемого типа.

Но если вы всегда ожидаете экземпляр A, вы можете упростить его до

function f<W extends { new(a: number): A }>(e: W): A {
  return new e(2)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...