Reactjs 通用类型脚本类型+;反作用钩

Reactjs 通用类型脚本类型+;反作用钩,reactjs,typescript,react-hooks,typescript-generics,use-reducer,Reactjs,Typescript,React Hooks,Typescript Generics,Use Reducer,我有以下http钩子: export const useHttp = <T,>(initUrl: string, initData: T) => { const [url, setUrl] = useState(initUrl); const [state, dispatch] = useReducer(fetchReducer, { isLoading: false, error: '', data: initD

我有以下http钩子:

export const useHttp = <T,>(initUrl: string, initData: T) => {
    const [url, setUrl] = useState(initUrl);
    const [state, dispatch] = useReducer(fetchReducer, {
        isLoading: false,
        error: '',
        data: initData
    });

    useEffect(() => {
        let cancelRequest = false;

        const fetchData = async (cancelRequest: boolean = false) => {
            if (!url) return;

            dispatch({ type: 'API_REQUEST'});
            try {
                const responsePromise: AxiosPromise<T> = axios(url);
                const response = await responsePromise;
                if (cancelRequest) return;
                dispatch({ type: 'API_SUCCESS', payload: response.data });
            } catch (e) {
                console.log("Got error", e);
                dispatch({ type: 'API_ERROR', payload: e.message });
            }
        };
        fetchData(cancelRequest);

        return () => {
            cancelRequest = true;
        }

    }, [url]);

    const executeFetch = (url: string) => {
        setUrl(url);
    };

    return { ...state, executeFetch}
};
但我得到:

Type '{ executeFetch: (url: string) => void; error: string; isLoading: boolean; data: unknown; }' is not assignable to type 'HttpReducer<T>'.
类型“{executeFetch:(url:string)=>void;错误:string;isload:boolean;数据:未知;}”不可分配给类型“HttpReducer”。
我能够。您希望
useReducer
钩子能够根据初始状态的类型推断出状态类型,但它只是推断
IState

useReducer
的类型,以便泛型参数是减速器的类型。状态的类型是从带有
ReducerState
实用程序类型的reducer中推断出来的。它不希望有一个通用的减速器,也不能很好地使用它

吊钩的
T
与减速器的
T
之间没有关系,而与状态无关
fetchReducer
是一个通用函数,这意味着它可以获取任何
IState
并返回相同类型的
IState
。我们可以使用这个函数来处理钩子的
IState
,但是为了推断状态的类型,我们需要说我们的函数只接受并返回
IState

您需要将
useReducer
上的泛型设置为:

const [state, dispatch] = useReducer<(state: IState<T>, action: TAction<T>) => IState<T>>( ...
我们需要该功能的特定用例:

export const useHttp = <Data,>(initUrl: string, initData: Data) => {
  const [url, setUrl] = useState(initUrl);
  const [state, dispatch] = useReducer<<T,>(state: IState<T>, action: TAction<T>) => IState<T>>(fetchReducer, {
export const useHttp = <Data,>(initUrl: string, initData: Data) => {
  const [url, setUrl] = useState(initUrl);
  const [state, dispatch] = useReducer<(state: IState<Data>, action: TAction<Data>) => IState<Data>>(fetchReducer, {
export const useHttp=(initUrl:string,initData:Data)=>{
const[url,setUrl]=useState(initUrl);
const[state,dispatch]=useReducer-IState>(fetchReducer{
当我们知道我们的减速器状态类型是
IState
,那么我们就知道
data
的类型是
data

现在调用
useHttp()
将提供类型为
IArticle[]
data
变量


尝试将类型添加到
状态
。或将返回类型添加到自定义挂钩。将类型添加到
状态
是什么意思?我的状态参数具有
IState
类型。问题中没有提到这一点……您是否尝试添加返回类型?如何键入
fetchReducer
。@Rameshredy不确定如何添加su我的案例的ch类型。用示例更新了我的问题
Type '{ executeFetch: (url: string) => void; error: string; isLoading: boolean; data: unknown; }' is not assignable to type 'HttpReducer<T>'.
const [state, dispatch] = useReducer<(state: IState<T>, action: TAction<T>) => IState<T>>( ...
const [state, dispatch] = useReducer<<T,>(state: IState<T>, action: TAction<T>) => IState<T>>(...
export const useHttp = <Data,>(initUrl: string, initData: Data) => {
  const [url, setUrl] = useState(initUrl);
  const [state, dispatch] = useReducer<<T,>(state: IState<T>, action: TAction<T>) => IState<T>>(fetchReducer, {
export const useHttp = <Data,>(initUrl: string, initData: Data) => {
  const [url, setUrl] = useState(initUrl);
  const [state, dispatch] = useReducer<(state: IState<Data>, action: TAction<Data>) => IState<Data>>(fetchReducer, {