определить универсальный создатель редукса в машинописи - PullRequest
0 голосов
/ 29 октября 2019

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

import { Action } from 'redux';

// Generic Action
interface ActionWithPayload<TType extends string, TPayload> extends Action<TType> {
  payload: TPayload;
}

// Example type using ActionWithPayload
type SetLoggedInAction = ActionWithPayload<string, boolean>;

// I have a non-generic action creator for SetLoggedInAction
type SetLoggedIn = (payload: SetLoggedInAction['payload']) => SetLoggedInAction;

// I want to make the above action creator generic, but this does not work
// throws "Type 'TAction["type"]' does not satisfy the constraint 'string'"
type GenericActionCreator<
  TAction extends ActionWithPayload<TAction['type'], TAction['payload']>
> = (payload: TAction['payload']) => TAction;

Я не уверен, как получить тип GenericActionCreator дляПринимайте только тип ActionWithPayload в качестве аргумента, поскольку он также требует двух аргументов.

Цель состоит в том, чтобы получить тип, который будет использоваться следующим образом:

type SetLoggedIn = GenericActionCreator<SetLoggedInAction>;

И использовать его в моем определении функциивот так:

export const setLoggedIn: SetLoggedIn = payload => ({
  type: 'SET_LOGGED_IN',
  payload
});

Я видел другие способы ввода функции (например, Как набирать действия Redux и редукторы Redux в TypeScript? ), но я хотел бы попробоватьдля этого решения, если это возможно

1 Ответ

1 голос
/ 29 октября 2019

Это не работает, поскольку вы создали циклическую зависимость от TAction:

TAction extends ActionWithPayload<TAction['type'], TAction['payload']>

Поскольку вы не задаете какой-либо конкретный тип действия или полезную нагрузку, этого достаточносообщить TS, что TAction расширяет любой тип ActionWithPayload.

Следующее исправление должно помочь вам:

type GenericActionCreator<TAction extends ActionWithPayload<string, any>> = 
    (payload: TAction['payload']) => TAction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...