Reduce () для состояния объекта Typescript - PullRequest
0 голосов
/ 09 июля 2020

У меня проблема с доступом к состоянию редукции с помощью функции Array.prototype.reduce() внутри файла .ts.

Вот упрощенный пример:

const state = store.getState();
const path: string = ["orders", "delay"].reduce(
   (accumulator, currentValue) => accumulator[currentValue], state) 

// it correlates to: const path = state.orders.delay 

// accumulator - string
// currentValue - string
// state - result of combineReducers, middleware, and devtools 

В конце reduce () Я получаю «строку», но теперь я получаю сообщение об ошибке, потому что состояние не является «строковым» типом.

Как мне это правильно ввести?

1 Ответ

1 голос
/ 09 июля 2020

Это очень сложно (я имею в виду очень ручной) в TypeScript:

// Unfortunately you will need to write a lot of manual function overloads
function getValue<S, P1 extends keyof S>(state: S, path: [P1]): S[P1];
function getValue<S, P1 extends keyof S, P2 extends keyof S[P1]>(state: S, path: [P1, P2]): S[P1][P2];
function getValue<S, P1 extends keyof S, P2 extends keyof S[P1], P3 extends keyof S[P1][P2]>(
  state: S,
  path: [P1, P2, P3],
): S[P1][P2][P3];
function getValue<S>(state: S, path: (keyof S)[]) {
  // You can also use your reduce solution, this is faster since it does not involve a function call
  let current: any = state;
  for (let i = 0; i < path.length; i++) current = current[path[i]];

  return current;
}

В основном вы объявляете столько перегрузок функций, сколько уровней имеется в вашем состоянии. То, что вы получаете взамен, довольно приятно, посмотрите эту игровую площадку TypeScript с кодом и примерами!

...