Infer Generic Type-Arguments из словаря в TypeScript - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно создать объект, содержащий разные методы. Каждый метод может иметь различную полезную нагрузку. Поэтому я хочу добавить безопасность типа.

Вопрос

Есть ли способ указать, что каждый метод может иметь различный тип полезной нагрузки?

Состояние как есть

Действие набирается следующим образом:

export type Action<TPayload> = (payload?: TPayload) => TPayload;

Тогда мне нужно создать словарь этих методов. В следующем примере кода вводится ошибка .

export interface Actions<TPayload> { 
                      // ^--- TypeScript should get to know that TPayload is different for each action
  [key: string]: Action<TPayload>;
}

Следующий фрагмент кода показывает, что эти наборы приводят к потере всей информации созданного словаря.

class Customer {}
class Product {}

const actions: Actions<Customer|Product> = {
  addCustomer: (payload: Customer) => ({}),
  addProduct: (payload: Product) => ({}),
};

У объекта actions нет методов.

Моя цель

Я хочу получить что-то вроде этого:

enter image description here

Заранее спасибо за любые отзывы или предложения по этому вопросу.

Фон

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

...