React Hooks 和 TypeScript 获取 API:对象可能为“null”
2019-06-07
2453
我正在做一个关于 React Hooks 和获取数据的教程。这是我用来获取客户并将其映射到列表中的组件:
const useFetch = (url: string) => {
const [customers, setCustomers] = useState<null | []>(null);
const [loading, setLoading] = useState(true);
// Similiar to componentDidMount() and componentDidUpdate()
useEffect(() => {
const fetchData = async () => {
const result = await axios(url);
setCustomers(result.data);
setLoading(false);
};
fetchData();
});
return { customers, loading };
};
const url = 'https://jsonplaceholder.typicode.com/users';
export const LatestCustomers: React.FC<Props> = ({
description
}: Props): JSX.Element => {
const { customers, loading } = useFetch(url);
return (
<Container>
{loading ? (
<div>...Loading...</div>
) : (
<tr>
{customers.map(customer => (
<div key="user.id">{customer.name}</div>
))}
</tr>
)}
</Container>
);
};
这样,我得到了错误:
Object is possibly 'null'. TS2531
108 | ) : (
109 | <tr>
> 110 | {customers.map(customer => (
| ^
111 | <div key="user.id">{customer.name}</div>
112 | ))}
113 | </tr>
我该如何解决这个问题?
2个回答
由于提供给
useState
的类型为
null | []
,因此
customers
被赋予该类型签名。
有几种方法可以解决这个问题。我的建议是从一个空数组开始:
const [customers, setCustomers] = useState<[]>([]);
或者,如果您希望保留可选的类型,那么您应该首先检查
customers
是否不是
null
:
{customers && customers.map(customer => ( ...
或者,如果您确实确定它将始终被定义,则可以使用
TypeScript 非空断言
!
运算符:
{customers!.map(customer => (
djskinner
2019-06-07
处理可空值的一个可靠解决方案可能是在 fp-ts 中使用 Option 和
fromNullable
https://github.com/gcanti/fp-ts/blob/master/src/Option.ts
示例:
{fromNullable(customers).map(x=> {...})>
有趣的文章: https://davetayls.me/blog/2018/05/20/fp-ts-01-working-with-nullable-values
否则更直接的方法:
{customers && customers.map(x => ( ...
GibboK
2019-06-07