Как передать ngrx actionCreator в качестве параметра функции? - PullRequest
0 голосов
/ 04 апреля 2020

Как можно ввести параметр action функции loader, чтобы он не использовал TypedAction, который не экспортируется ngrx?

Я хочу обеспечить безопасность типов в качестве текущего пример делает.

const loadItemsAction = createAction(
  'load items',
  props<{ items: Item[] }>()
);

function loader(action: ActionCreator<
  string,
  (props: {
    items: Item[];
  }) => TypedAction<string> & { items: Item[] }   // TypedAction is not exported from ngrx!
>){
  return action({ items: [{name: 'item1'}, { name: 'item2'}]});
}

Я могу эффективно деструктурировать TypedAction следующим образом, но он теряет признак того, что Action возвращается. Есть ли лучший способ?

function loader(action: ActionCreator<
  string,
  (props: {
    items: Item[];
  }) => { readonly type: string, items: Item[] }
>){
  return action({ items: [{name: 'item1'}, { name: 'item2'}]});
}

1 Ответ

0 голосов
/ 05 апреля 2020

Я не мог получить что-либо с существующими типами ngrx, поэтому добавил свой собственный интерфейс, который идентифицирует объект как ActionCreator и позволяет легко указать тип этих объектов:

export interface ActionCreatorWithProps<TPropArgs extends object = {}>
  extends ActionCreator<
    string,
    (props: TPropArgs) => TPropArgs & { readonly type: string }
  > {}

, используемый в исходном примере :

function loader(action: ActionCreatorWithProps<{ items: Item[] }>) {
  return action({ items: [{name: 'item1'}, { name: 'item2'}]});
}
...