Реагируйте, используя пользовательскую функцию крючка

#reactjs #typescript

Вопрос:

Я хочу использовать пользовательскую функцию крючка

пользовательский код крючка

 import { useState, useCallback, useEffect } from 'react';
import { apiClient } from './apiClient';

export default (api: string) => {
  const [data, setData] = useState();

  const getData = useCallback(async () => {
    try {
      const response = await apiClient.get(api);
      setData(response.data);
    } catch (err) {
      console.log(err);
    }
  }, [data]);

  return [data, getData];
};
 

код приложения

 const [data, getData] = useGetData('posts');

  useEffect(() => {
    getData(); <- error
  }, []);
 

сообщение об ошибке

Невозможно вызвать объект, который, возможно, «не определен». ts(2722)

Как можно использовать функцию пользовательского крючка ?

Комментарии:

1. В чем ошибка, которую это вам дает ?

2. Не удается вызвать объект, который, возможно, «не определен». ts(2722) это сообщение об ошибке…

Ответ №1:

Вам нужно будет явно ввести функцию, чтобы вернуть 2-кортеж, так как TypeScript не может точно определить это. Он выводит массив.

 export default (api: string): [any, () => void] => {
 

(или лучший тип , чем any , но я не знаю, что возвращает ваш API.)

Чтобы улучшить набор текста, вы можете сделать его универсальной функцией:

 import { useState, useCallback } from "react";

export default function useGetData<T>(api: string): [T | undefined, () => void] {
  const [data, setData] = useState<T | undefined>(undefined);
  const getData = useCallback(async () => {
    try {
      const response = await apiClient.get(api);
      setData(response.data as T);
    } catch (err) {
      console.log(err);
    }
  }, [data]);
  return [data, getData];
}