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'
});