reactjs - 使用 next.js 时 typescript 上的错误数据类型

标签 reactjs typescript next.js react-hooks

我在了解要从中获取 API 的 URL 的数据类型时遇到问题,并且我正在使用自定义 Hook 来使其可用我正在将 Next.js 与 typescript 结合使用

这是一个useFetch.js(自定义 Hook )

"use client"
import { useState } from "react";

type FetchParams = {
  url: any
}

async function getData(url: FetchParams) {
  try {
    const res = await fetch(url.toString())
    return res.json()
  } catch(error) {
    console.log("error", error);
  }
}

export default async function useFetch(url: FetchParams) {
  const [data, setData] = useState("")
  setData(await getData(url))
  return { data };
}

这是一个祈祷组件

import useFetch from '@/Hooks/useFetch';
import { useState, useEffect } from 'react';

export default function Pray() {
  // Date methods
  let date = new Date();
  let month = date.getMonth() + 1;
  let year = date.getFullYear();
  // day equal date - 1
  let day = date.getDate()-1;

  const [country, setCountry] = useState('eg')
  const [city, setCity] = useState('cairo')

  const [data, setData] = useState("")
  
  useEffect(() => {
    const { data }: any = useFetch(`https://api.aladhan.com/v1/calendarByCity?city=${city}&country=${country}&method=5&month=${month}&year=${year}`)
    console.log(data)  
  }, [data])
  
  return()
}

错误是:

Argument of type 'string' is not assignable to parameter of type 'FetchParams'.ts(2345)

const { data }: any = useFetch(`https://api.aladhan.com/v1/calendarByCity?city=${city}&country=${country}&method=5&month=${month}&year=${year}`)

最佳答案

您已声明 useFetch 来使用 FetchParams 类型参数,而不是字符串类型参数。

更新 useFetch 以使用 URL 字符串类型值。不要忘记使用 useEffect Hook 来发出获取和更新 data 状态的副作用。

"use client"
import { useState } from "react";

async function getData(url: string) {
  try {
    const res = await fetch(url);
    return res.json();
  } catch(error) {
    console.log("error", error); 
  }
}

export default async function useFetch(url: string) {
  const [data, setData] = useState("");

  useEffect(() => {
    getData(url).then(setData);
  }, [url]);

  return { data };
}

或者你可以传递一个对象:

type FetchParams = {
  url: string
}

async function getData(fetchParams: FetchParams){
  try {
    const res = await fetch(fetchParams.toString());
    return res.json();
  } catch(error) {
    console.log("error", error); 
  }
}

export default async function useFetch(fetchParams: FetchParams) {
  const [data, setData] = useState("");

  useEffect(() => {
    getData(url).then(setData);
  }, [fetchParams]);

  return { data };
}
const { data }: any = useFetch({
  url: `https://api.aladhan.com/v1/calendarByCity?city=${city}&country=${country}&method=5&month=${month}&year=${year}`
});

useFetch Hook 无法useEffect Hook 的回调函数中调用。它必须作为组件或其他自定义 React Hook 的顶层进行调用。删除 data 状态并简单地引用 useFetch Hook 的返回值。

export default function Pray() {
  // Date methods
  let date = new Date();
  let month = date.getMonth() + 1;
  let year = date.getFullYear();
  // day equal date - 1
  let day = date.getDate()-1;

  const [country, setCountry] = useState('eg');
  const [city, setCity] = useState('cairo');

  const { data }: any = useFetch(
    `https://api.aladhan.com/v1/calendarByCity?city=${city}&country=${country}&method=5&month=${month}&year=${year}`
  );
  
  return (....);
}

关于reactjs - 使用 next.js 时 typescript 上的错误数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76873565/

相关文章:

typescript - 默认接口(interface)对象

reactjs - useEffect 错误 : Minified React error #321 (GTM implementation instead of google analitycs)

node.js - 无法使用 Multer、React、Node.js、Sequelize、PostgreSQL 访问上传的照片

javascript - Radium 不适用于 React Router IndexLink 组件

javascript - 如何将包含多个对象的一个​​对象的数组转换为对象数组

typescript - 无法使用 TypeScript 从外部 NPM 库导入命名导出

node.js - 无法使用自定义 Express 服务器解析 nextjs 中的 'fs'

javascript - 导出类或对象实例差异

reactjs - youtube上IE上的ReactPlayer抛出 “Video Unavailable”错误

typescript - 访问 TypeScript 中定义的类的 .constructor