非初始化归约器中必须有类型断言吗?

时间:2019-06-30 10:50:08

标签: cyclejs

由于减速器is defined as的类型

export type Reducer<T> = (state: T | undefined) => T | undefined;

在不是初始减速器的减速器中,我必须声明

state = state as State

请问我有什么遗漏吗?还是这是一个小麻烦?

1 个答案:

答案 0 :(得分:0)

非初始化简可以在(state: T) => T中键入(在TypeScript中),它们将与库中的Reducer<T>类型兼容。这是我代码库中的一个示例,第一个代码片段是一个初始化约简器,需要对未定义的大小写进行处理:

const initReducer$ = xs.of(function initReducer(prev?: State): State {
  if (prev) {
    return prev;
  } else {
    return {
      selfFeedId: '',
      currentTab: 0,
    };
  }
});

第二个代码段是一个非初始的reducer,我可以确定先前的状态不是未定义的:

const setSelfFeedId$ = ssbSource.selfFeedId$.map(
  selfFeedId =>
    function setSelfFeedId(prev: State): State {
      return {...prev, selfFeedId};
    },
);

请注意,当这些流合并时,结果类型可以为Stream<Reducer<State>>,而无需进行任何类型的转换:

const reducer$: Stream<Reducer<State>> = xs.merge(initReducer$, setSelfFeedId$);