首页 > 解决方案 > 非初始化简器中必须有类型断言吗?

问题描述

由于减速器的类型定义为

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

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

state = state as State

请问我遗漏了什么,或者这被认为是轻微的不便?

标签: cyclejs

解决方案


可以键入非初始 reducer(在 TypeScript 中)(state: T) => T,这些将与Reducer<T>库中找到的类型兼容。这是我的代码库中的一个示例,第一个片段是一个初始 reducer,需要处理未定义的情况:

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

第二个片段是一个非初始减速器,我确信之前的状态不是未定义的:

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$);

推荐阅读