使用dva和typescript时dispatch函数的跳转方法

主要用于IDE方法间跳转.
假设有以下数据结构:

export type ModelType = {
  namespace: string;
  state: StateType;
  effects: {
    queryProject: Effect;
  };
  reducers: {
    updateToolContentHeight: Reducer<StateType>;
}

const Model: ModelType = {
  namespace: 'Studio',
  effects: {
    queryProject: Effect;
  };
  reducers: {
    updateToolContentHeight: Reducer<StateType>{}
}

export const [ALERT_MODEL, ALERT_MODEL_ASYNC] = createModelTypes(AlertModel);

跳转方法定义

interface BaseModeType {['reducers']: {}, ['effects']: {}, ['namespace']: string}
type MemberType<T extends BaseModeType, U> = U extends 'effects' ? T['effects'] : T['reducers']

function getModelTypes<T extends BaseModeType>(target: T, type: 'effects' | 'reducers'):
    { [K in keyof MemberType<T, typeof type>]: string } {
  const reducers = Object.keys(target[type]).map((obj: string) => [obj, `${target.namespace}/${obj}`]);
  // @ts-ignore
  return Object.fromEntries(new Map<keyof typeof target[type], string>(reducers));
}

export const createModelTypes = <T extends BaseModeType>(
  target: T
): [{ [K in keyof T['reducers']]: string }, { [K in keyof T['effects']]: string }] => {
  return [ getModelTypes(target, 'reducers'), getModelTypes(target, 'effects') ];
};

使用

   dispatch({
      type: ALERT_MODEL.saveTabs,
      payload: { ...props.tabs }
    });

跳转方法部分类型处理应该可以进一步优化.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容