Reactjs 键入自定义钩子/类型脚本时出现问题

Reactjs 键入自定义钩子/类型脚本时出现问题,reactjs,typescript,Reactjs,Typescript,我在键入以下钩子时遇到问题: import { SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; type Callback<T> = (value?: T) => void; type DispatchWithCallback<T> = (value: T, callback?: Callback<T>) => void; function use

我在键入以下钩子时遇到问题:

import { SetStateAction, useCallback, useEffect, useRef, useState } from 'react';

type Callback<T> = (value?: T) => void;
type DispatchWithCallback<T> = (value: T, callback?: Callback<T>) => void;

function useStateCallback<T>(initialState: T | (() => T)): [T, DispatchWithCallback<SetStateAction<T>>] {
  const [state, _setState] = useState(initialState);

  const callbackRef = useRef<Callback<T>>();
  const isFirstCallbackCall = useRef<boolean>(true);

  const setState = useCallback((setStateAction: SetStateAction<T>, callback?: Callback<T>): void => {
    callbackRef.current = callback;
    _setState(setStateAction);
  }, []);

  useEffect(() => {
    if (isFirstCallbackCall.current) {
      isFirstCallbackCall.current = false;
      return;
    }
    callbackRef.current?.(state);
  }, [state]);

  return [state, setState];
}

export default useStateCallback; 
无类型脚本错误:

const [state, setState] = useStateCallback<InitialState>({ firstName: 'Bob', lastName: 'Donovan'});
setState({ firstName: 'Claire', lastName: 'Donovan'}, (curState) => {
  console.log(curState) // => { firstName: 'Claire', lastName: 'Donovan'}
});

打字有什么问题?

根据我的理解,似乎有一些打字应该重新定义:

//第一个参数将采用`T`或`(prevState:T)=>T`
键入DispatchWithCallback=(值:SetStateAction,callback?:callback)=>void;
//那么'DispatchWithCallback'应该只取'T'`
函数useStateCallback(initialState:T |(()=>T)):[T,DispatchWithCallback]{

发生了什么错误?
const [state, setState] = useStateCallback<InitialState>({ firstName: 'Bob', lastName: 'Donovan'});
setState({ firstName: 'Claire', lastName: 'Donovan'}, (curState) => {
  console.log(curState) // => { firstName: 'Claire', lastName: 'Donovan'}
});
const [state, setState] = useStateCallback<InitialState>({ firstName: 'Bob', lastName: 'Donovan'});
setState({ firstName: 'Claire', lastName: 'Donovan'}, (curState) => {
  console.log(curState.firstName) // => 'Claire'
});