请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问老师为什么不会报错

请问下老师,这章节我有一个小疑问。

关于如果调用axios.request(config),这是我仅仅传入了一个参数。

AxiosInstance 这个interface规定了request接受一个参数没错,但是

https://img1.sycdn.imooc.com//szimg/5fa67382091cbc9f10200224.jpg

这段逻辑,new Axios这个类返回context实例中,存在一个request原型方法,这时request方法在类中定义的是接受两个any参数。可是createInstance方法返回的AxiosInstance类型定义上要求原型上的request只有一个config参数。

简单描述就是说返回的instance这个实例,是AxiosInstance类型。AxiosInstance类型定义原型上的request仅接受一个参数。而context实例上的request方法确实上接受两个参数。

这是类上的request方法参数定义,只接受一个config参数且要求AxiosRequestConfig类型。

https://img1.sycdn.imooc.com/szimg/5fa6751609f1e79a11860456.jpg

这是interface中的request方法定义。

https://img1.sycdn.imooc.com//szimg/5fa674720939722110380140.jpg

这时TS为什么不会报错,明明参数个数对不上以及参数类型也对不上。




正在回答

3回答

虽然是两个参数,但是注意第一个是 any,第二个也是 any,而且第二个还是可选参数,说明可以是任意类型的一个参数,也可以是任意类型的两个参数,所以这种定义是匹配类型定义的。

0 回复 有任何疑惑可以回复我~
  • 提问者 hy_wang #1
    老师我还是不是很明白,我认为是最后createInstace工厂函数中的return使用了类型断言从而导致并没有报错。我写了一个简单的demo,请老师看看没有报错是因为类型断言的原因吗
    回复 有任何疑惑可以回复我~ 2020-11-07 18:41:06
  • 提问者 hy_wang #2
    希望老师解惑
    回复 有任何疑惑可以回复我~ 2020-11-07 18:44:00
  • ustbhuangyi 回复 提问者 hy_wang #3
    你把 demo 传到 GitHub 上吧
    回复 有任何疑惑可以回复我~ 2020-11-07 21:18:18
提问者 hy_wang 2020-11-07 19:30:50

https://img1.sycdn.imooc.com//szimg/5fa6855a09f48cfd17021302.jpg

老师这是我的理解

0 回复 有任何疑惑可以回复我~
提问者 hy_wang 2020-11-07 18:43:49

https://img1.sycdn.imooc.com//szimg/5fa67a22096c084212861014.jpg

老师我仍然认为本身request类型定义一个参数,但是类中的原型request方法有两个参数定义。那么就会报错,但是因为课程中return的时候进行了断言所以就不会报错。

0 回复 有任何疑惑可以回复我~
  • 你这个例子,这样定义
    
    const obj = {
        get(a: any, b?: any) {
          return 'a'
        }
      }
    
    就不报错了
    回复 有任何疑惑可以回复我~ 2020-11-09 10:48:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信