我有一个问题,知道的数据类型的URL,我将从它的API,我正在使用一个定制的钩子,使它可用我正在使用Next.js与类型脚本

这是一个useFetch.js(定制挂钩)

"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()
}

错误为:

"字符串"类型的参数不能赋值给类型的参数 《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钩子来发出进行获取和更新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}`
});

useEffect挂钩的回调函数中调用useFetch挂钩104.必须将其作为组件或其他自定义Reaction挂钩的顶级调用.删除data状态,只需引用useFetch挂钩的返回值.

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 (....);
}

Typescript相关问答推荐

类型脚本:类型是通用的,只能索引以供阅读.(2862)"

Tailwind CSS样式不在Svelte应用程序中呈现

根据另一个成员推断类成员的类型

如何创建泛型类型组件来使用React Native的FlatList或SectionList?'

在TypeScript中,除了映射类型之外还使用的`in`二进制运算符?

如果一个变量不是never类型,我如何创建编译器错误?

在泛型类型中对子代执行递归时出错

如何在TypeScrip中从字符串联合类型中省略%1值

PrimeNG日历需要找到覆盖默认Enter键行为的方法

TypeScrip中的类型安全包装类

如何以Angular 导入其他组件S配置文件

如何将对象数组中的键映射到另一种对象类型的键?

我可以使用typeof来强制执行某些字符串吗

为什么在泛型方法中解析此promise 时会出现类型错误?

如何键入并类型的函数&S各属性

如何将通用接口的键正确设置为接口的键

我可以将一个类型数组映射到TypeScrip中的另一个类型数组吗?

参数未映射泛型返回类型

如何提取具有索引签名的类型中定义的键

如何让 Promise 将它调用的重载函数的类型转发给它自己的调用者?