首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应泛型useFetch状态

响应泛型useFetch状态
EN

Stack Overflow用户
提问于 2022-08-06 16:47:42
回答 2查看 63关注 0票数 2

我正在尝试编写一个定制钩子useFetch,它对不同的数据提出许多请求。

问题是我不能正确地键入我的约会对象,我有这样的状态。

代码语言:javascript
复制
interface IState<T> {
   data:  T | T[]
   loading: boolean,
   error: boolean,
}

初始状态

代码语言:javascript
复制
const initialState = {
   data: [],
   loading: false,
   error: false,
}

useEffect

代码语言:javascript
复制
useEffect(() => {
        setData((prevState) => ({...prevState, loading: true}));
        axios.get(url)
            .then(response => response.data.results ? response.data.results as T[] : response.data as T)
            .then((data) => (setData((prevState) => ({...prevState, loading: false, data}))))
            .catch(e => {
                setData((prevState) => ({...prevState, error: true}));
                if (e instanceof Error) console.log(e.message);
            })
}, []);

当我得到response.data.results时,我有一个对象数组,当我有response.data时,我只有一个对象。我正试着回到正确的类型。

我把我的函数叫做这个useFetch,我有类似于这个MovieType \ MovieType[]的结果。我不需要TypeGuard,我只需要一种正确的类型。

如果你看到任何问题,请告诉我。

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2022-08-06 17:23:53

这个例子在联合时不可能有一个单数类型。

泛型函数不知道它将以T[]还是T对象输出哪个函数,因为您是如何定义IState的。

当您从钩子中读取.data时,您只需检查它是否是一个数组。

Sana Mumtaz说,拥有单一输出类型的唯一方法是删除联合T[],并像Sana Mumtaz那样简单地转换。

代码语言:javascript
复制
interface IState<T> {
   data:  T
   loading: boolean,
   error: boolean,
}

const useFetch = <T>(): IState<T> => {
   // ...
   response => (response.data.results ? response.data.results : response.data) as T
}

useFetch<MovieType[]>();
票数 3
EN

Stack Overflow用户

发布于 2022-08-06 17:21:15

Axios.get是一个泛型函数,所以您可以利用它。

试一试

代码语言:javascript
复制
useEffect(() => {
    setData((prevState) => ({ ...prevState, loading: true }));
    axios.get<{ results: T[] } | T>(url)
        .then(({ data }) => "results" in data ? data.results : data)
        .then(data => {
            setData(prevState => ({ ...prevState, loading: false, data }))
        })
        .catch(e => {
            setData((prevState) => ({ ...prevState, error: true }));
            if (e instanceof Error) console.log(e.message);
        })
}, []);

参见操场示例这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73261629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档