несоответствие типизации потока для функции, принимающей редуктор - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу создать функцию, которая что-то делает с редуктором (не важно, что это такое, просто какое-то преобразование, похожее на Объединение редукторов).У меня есть проблема, когда я хочу абстрагироваться state для редуктора.Вот упрощенный редуктор, используемый для некоторого компонента:

type someState = {
  foo: number,
};
export const someSimpleReducer = (state: someState) => state;

type StateAbstract = {}; // this doesn't work
// type StateAbstract = any; // this works

, а вот абстрактная функция преобразования с абстрактным состоянием:

declare type SimpleReducer<S> = (state: S) => S;

export const transformReducer = (reducer: SimpleReducer<StateAbstract>) => ({
  reducer,
});

transformReducer(someSimpleReducer);

я вижу следующую ошибку потока:

Поток: невозможно вызвать transformReducer с someSimpleReducer, связанным с reducer, поскольку свойство foo отсутствует в StateAbstract [1], но существует в someState [2] в первом аргументе

Если я использую type StateAbstract = any, то я не вижу никакой ошибки ... Как я могу написать StateAbstract type, чтобы это не any, а объект?

1 Ответ

0 голосов
/ 25 ноября 2018
declare type SimpleReducer<S> = (state: S) => S;

объявляет тип SimpleReducer, который является функцией, которая принимает S и возвращает S.

transformReducer является функцией, которая принимает SimpleReducer<StateAbstract>, то есть функцию, которая принимает StateAbstract и возвращает StateAbstract.

transformReducer не должно заботиться о том, какой тип принимает и возвращает функция редуктора.Вместо того, чтобы использовать конкретный тип, используйте универсальный:

export const transformReducer = <S>(reducer: SimpleReducer<S>) => ({reducer})

Здесь он находится в Try Flow.

...