reactjs - 如何在打字稿中调用使用钩子的函数?
问题描述
我试图将打字稿(我当然是新的)添加到我的反应项目中。我写了一个从我写的 api 获取数据的钩子。我想添加类型,但我认为由于渲染开始时未定义状态,打字稿不会编译。我正在猜测。问题在于在 VictoryPie 组件中调用 formatData 函数。我得到的错误是:
TypeScript error: Argument of type 'boolean | never[]' is not assignable to parameter of type 'Data[]'.
Type 'false' is not assignable to type 'Data[]'. TS2345
26 | <VictoryPie
27 | colorScale={['tomato', 'orange', 'gold', 'cyan', 'navy']}
> 28 | data={formatData(graphData)}
| ^
29 | x="description"
30 | y="amount"
31 | />
import React from 'react';
import {useFetch} from '../hooks';
import {VictoryPie} from 'victory';
interface Data {
_id: number,
id: string,
userName: string,
amount: number,
description: string,
time: string,
}
const Graph = () => {
const [graphData, loading] = useFetch('/api/Kamil');
const formatData = (inputData: Array<Data>) => {
return inputData.map(
({_id, id, time, userName, ...keepAttrs}) => keepAttrs,
);
};
return (
<>
{loading ? (
'Loading...'
) : (
<VictoryPie
colorScale={['tomato', 'orange', 'gold', 'cyan', 'navy']}
data={formatData(graphData)}
x="description"
y="amount"
/>
)}
</>
);
};
export default Graph;
钩
import {useState, useEffect} from 'react';
import axios from 'axios';
function useFetch(url: string) {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
async function fetchUrl() {
const response = await axios(url);
console.log(response);
setData(response.data)
setLoading(false);
}
useEffect(() => {
fetchUrl();
}, []);
return [data, loading];
}
export { useFetch };
解决方案
这里有2个问题。
您需要声明您的钩子返回元组。现在打字稿假设您正在返回数据数组并以任何顺序加载。
此外,您需要声明您期望什么样的结果作为获取结果。
你的钩子应该看起来像
function useFetch<ExpectedResult>(url: string, initialData: ExpectedResult): [ExpectedResult, boolean] {
const [data, setData] = useState(initialData);
const [loading, setLoading] = useState(true);
async function fetchUrl() {
const response = await axios(url);
console.log(response);
setData(response.data)
setLoading(false);
}
useEffect(() => {
fetchUrl();
}, [url]); // <<-- when url is changed you propably want to re-fetch
return [data, loading];
}
然后当你使用它时
做它喜欢
type DataFromServer = Date[];
const [data, isLoading] = useFetch<DataFromServer>('/api/Kamil', []);
现在打字稿知道[data, isLoading]
应该是什么。
推荐阅读
- javascript - 嵌入式 iframe 不滚动
- git - 从已删除的文件中删除 Github 树哈希
- sql - RequestError:参数验证失败 - 缓冲区无效
- python - 启动远程 Python 应用程序并验证它是否正在运行
- sql - 在另一列查询中查找子字符串?
- c# - 在表单设计器中设置 WinForms SplitContainer 面板的初始大小
- asp.net - 调整 SQL 查询的网格隐藏列控件
- php - while 循环第一次迭代不起作用吗?
- gcc - 使用 Makefile 编译时缺少 main 函数
- powershell - 如何使用 Powershell 重命名 IIS 网站目录(拒绝访问错误)