Generi c Функция TypeScript, которая создает экземпляры классов - PullRequest
4 голосов
/ 13 апреля 2020

Я намеревался написать обобщенную c функцию TypeScript, которая принимает конструктор класса в качестве аргумента, а также любые аргументы, требуемые конструктором, и возвращает новый экземпляр класса. Одно из моих требований заключается в том, что тип возвращаемого значения и типы аргументов конструктора должны выводиться компилятором.

После некоторых проб и ошибок я пришел к рабочей версии, которая, кажется, делает то, что мне нужно (см. Ниже). Но есть ли лучший способ добиться этого?

function instantiate<Params extends any[], Instance>(
    ctor: new (...args: Params) => Instance, ...args: Params
) {
    return new ctor(...args);
}

Пример использования:

class Circle {
    constructor(public radius: number) {}
}

class Rectangle {
    constructor(public width: number, public height: number) {}
}

const circle = instantiate(Circle, 5);
const rectangle = instantiate(Rectangle, 3, 7);

Попробуйте на TypeScript Playground

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете упростить использование обобщенных типов c, используя ConstructorParameters и InstanceType типов утилит:

function instantiate<T extends new (...args: any[]) => any>(
    ctor: T, ...args: ConstructorParameters<T>
): InstanceType<T> {
    return new ctor(...args);
}
...