Typescript generi c ограничение типа из массива типов - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть массив типов, объявленных как

const APIS = [NewsApi, CommentsApi, FileApi];

Я хочу иметь метод, который принимает один из этих типов из этого массива APIS, например:

myMethod<T extends anyof APIS>(apiType: T): T {
    const api = new apiType(); //pseudo code, does not work off course
    // some common configuration code
    return api;
} 

. Я не могу сделать myMethod<T extends NewsApi|CommentsApi>(): T, так как массив APIS генерируется автоматически. Возможно ли это с машинописью?

Обновление:

Решение Алексея отлично подходит для передачи ввода. Тем не менее, тип возврата не может быть выведен из использования.

const myApi = myMethod(NewsApi);

В вышеупомянутом случае, myApi не имеет тип NewsApi, но NewsApi|CommentsApi|FileApi. Можно ли явно установить тип возвращаемого значения для экземпляра типа ввода API?

1 Ответ

1 голос
/ 15 февраля 2020

Если вы можете изменить определение массива на кортеж только для чтения:

const APIS = [NewsApi, CommentsApi, FileApi] as const;

, то вы можете получить объединение возможных значений массива, используя тип поиска:

type ApiConstructors = typeof APIS[number];

function myMethod<T extends InstanceType<ApiConstructors>>(apiType: new () => T): T {
  return new apiType();
}

const api = myMethod(NewsApi); // api is of type NewsApi

InstanceType утилита, используемая для получения типа экземпляра функции конструктора.

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...