https://coding.imooc.com/learn/questiondetail/lz14NYLqGV2XK2p9.html 的延伸

来源:3-12 自定义 hook 第三部分 - 正确的方式完成 URLLoader

ywang04

2022-09-17

老师 我发现如果返回数组[data, loading] 会有如下问题

import { useState, useEffect } from 'react';
import axios from 'axios';

const useURLLoader = (url: string, deps: any[] = []) => {
const [data, setData] = useState<any>(null);
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
axios.get(url).then((result) => {
setData(result.data);
setLoading(false);
});
}, deps);
return [data, loading];
};

export default useURLLoader;

loading也会被认为是any type, 如果是返回object {data, loading} 就没有这个问题

http://img.mukewang.com/szimg/6325295209b2ba2309980224.jpg


http://img.mukewang.com/szimg/6325298a09f7aed611040198.jpg


另外 为啥我没有判断 dogResult是否存在,编译器也没有报错。我用的是ts 4.8.2 版本

dogResult && dogResult.message
<img src={dogResult.message} alt="dog" />

http://img.mukewang.com/szimg/632529f209e99eef15120926.jpg

写回答

1回答

张轩

2022-09-18

 同学你好

这个可能是和 ts 版本有关系,在这里它的推论没有那么精确。可以手动的添加返回的类型,比如

(url: string, deps: any[] = []): [any, boolean]

这样就可以获取正确的类型了。

第二个问题

因为这里其实是不用判断也可以的,因为我们我们的类型断言已经指定它为 IShowResult,它不会是 undefined 类型

0
1
ywang04
非常感谢!
2022-09-18
共1条回复

React18+TS高仿AntD从零到一打造组件库

设计,开发,测试,发布再到 CI/CD,从0到1造轮子

2124 学习 · 959 问题

查看课程