TypeScript - создать экземпляр, используя свойство конструктора. - PullRequest
0 голосов
/ 26 апреля 2020

Я хочу создать функцию с именем createInstance, которая получает экземпляр a и создает новый экземпляр c того же типа, что и a. Обратите внимание, что внутри createInstance я не знаю, какой тип a, я знаю только, что он наследуется от некоторого класса A. Но я хочу, чтобы c был типа B, который является реальным типом a. Вот что у меня получилось:

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

class B extends A {
}

const createInstance = (a: A): void => {
    const t = a.constructor
    const c = new t("c")
    console.log(c)
    console.log(c instanceof B)
}

const b = new B("b")
createInstance(b)

Я пробовал это на игровой площадке, и это работает, я получаю true для c instanceof B. Но в строке new t("c") отображается предупреждение: «Это выражение не может быть построено. Тип« Функция »не имеет конструктивных сигнатур».

Как правильно это сделать? Спасибо

1 Ответ

1 голос
/ 26 апреля 2020

Это на самом деле все еще отсутствует в TypeScript, так как T.constructor не типа T, а простая функция. Вы можете принудительно привести его:

const t = a.constructor as { new(ref: string): A };

Редактировать: вы можете иметь уже набранный конструктор (список параметров), используя ConstructorParameters:

const t = a.constructor as { new(...args: ConstructorParameters<typeof A>): A };

См. Относительную проблему в репозитории TS # 4536 и этот аналогичный вопрос

Playground Link

...