Javascript Redux自定义observeStore函数的类型

Javascript Redux自定义observeStore函数的类型,javascript,typescript,redux,Javascript,Typescript,Redux,我正在尝试将Redux实现转换为Typescript,但是在使我们的类型安全方面遇到了困难 这是原始功能: function observeStore(store, select, onChange) { let currentState; function handleChange() { let nextState = select(store.getState()); if (nextState !== currentState) { currentS

我正在尝试将Redux实现转换为Typescript,但是在使我们的类型安全方面遇到了困难

这是原始功能:

function observeStore(store, select, onChange) {
  let currentState;

  function handleChange() {
    let nextState = select(store.getState());
    if (nextState !== currentState) {
      currentState = nextState;
      onChange(currentState);
    }
  }

  let unsubscribe = store.subscribe(handleChange);
  handleChange();
  return unsubscribe;
}
  • 如何确保
    select
    -函数实际返回状态的一部分(通常是嵌套对象或值)
  • 如何将returntype从
    select
    -参数传递到
    onChange
    -参数
我尝试过这样的方法,但没有成功:

function observeStore(store: RootState, select: (RootState) => PartOf???<RootState>, onChange: (ReturnType<typeof select>) => void): Unsubscribe
函数observeStore(存储:RootState,选择:(RootState)=>PartOf???,onChange:(ReturnType)=>void):取消订阅

类型取决于所选值的类型,因此需要使用通用函数。根据您的尝试,我假设
RootState
是一个已知值,因此我们需要的唯一泛型是选择器的返回类型

  • store
    是整个存储(而不是状态),因此我们使用从redux导入的
    store
    类型,将state generic设置为
    RootState
  • select
    是一个从状态中选择内容的函数,因此它接受
    RootState
    并返回
    T
  • onChange
    是一个函数,它接受所选值
    T
    并返回
    void
  • currentState
    是所选值
    T
    ,但它最初是
    未定义的
从“redux”导入{Store,Unsubscribe};
函数观测器(
店:店,,
选择:(state:RootState)=>T,
onChange:(所选:T)=>void
):退订{
让currentState:T |未定义;
函数handleChange(){
让nextState=select(store.getState());
if(nextState!==当前状态){
currentState=nextState;
onChange(当前状态);
}
}
let unsubscribe=store.subscribe(handleChange);
handleChange();
退订;
}

import {Store, Unsubscribe} from "redux";

function observeStore<T>(
  store: Store<RootState>,
  select: (state: RootState) => T,
  onChange: (selected: T) => void
): Unsubscribe {

  let currentState: T | undefined;

  function handleChange() {
    let nextState = select(store.getState());
    if (nextState !== currentState) {
      currentState = nextState;
      onChange(currentState);
    }
  }

  let unsubscribe = store.subscribe(handleChange);
  handleChange();
  return unsubscribe;
}