接受减速器的函数的流类型不匹配

flow typing mismatch for function accepting a reducer

我想创建一个对 reducer 做一些事情的函数(它是什么并不重要,只是一些转换,类似于 combineReducers)。当我想为减速器抽象 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);

我看到以下流程错误:

Flow: Cannot call transformReducer with someSimpleReducer bound to reducer because property foo is missing in StateAbstract [1] but exists in someState [2] in the first argument

如果我使用 type StateAbstract = any 那么我看不到任何错误... 我如何编写 StateAbstract 类型,使其不是 any,而是一个对象?

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

声明一个类型SimpleReducer,它是一个接受 S 和 returns 接受 S 的函数。

transformReducer 是一个接受 SimpleReducer<StateAbstract> 的函数,即接受 StateAbstract 和 returns 一个 StateAbstract.

的函数

transformReducer 不应该关心 reducer 函数采用什么类型和 returns。不要使用具体类型,而是使用泛型:

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

Here it is on Try Flow.