关于泛型检查

来源:8-4 -4 拦截器的设计与实现 - demo 编写

许愿瓶啊

2020-08-19

拦截器每一个元素的reslove方法如下:

interface PromiseChain<T> {
  resolved: ResolvedFn<T> | ((config: AxiosRequestConfig) => AxiosPromise)
  rejected?: RejectedFn
}

export interface ResolvedFn<T> {
  (val: T): T | Promise<T>
}

这里的 ResolvedFn 指定了接受和返回的类型必须相同,但实际使用中:

axios.interceptors.response.use(res => {
  res.data += '3'
  return res.data
})

我返回的是T类型的data类型,我以为ts会报错,但并没有,想问问老师原因是什么?
平时使用中响应拦截器有时候会传入和返回的类型不一致,这里设计成传入和返回的类型一致是不是有点不太合理呢?

写回答

2回答

许愿瓶啊

提问者

2020-08-20

//img.mukewang.com/szimg/5f3e4678099057d704910203.jpg

这里传入的是T类型 AxiosResponse

//img.mukewang.com/szimg/5f3e468009bf816305880590.jpg

resolved函数类型是 ResolvedFn<T> 所以这里返回也应该是 AxiosResponse 类型吧?

0
3
ustbhuangyi
回复
许愿瓶啊
嗯,默认是 any,没传确实是 AxiosResponse
2020-08-21
共3条回复

ustbhuangyi

2020-08-20

res.data 的类型就是泛型 T
//img.mukewang.com/szimg/5f3dffe1096dc69513620580.jpg

//img.mukewang.com/szimg/5f3dfffa09779f7010900294.jpg

函数的返回值是可以是 T 或者 Promise<T>

类型满足,当然不会报错了。

0
1
许愿瓶啊
老师回复里不能上传图片,我提交了个新回复,我认为这里的T应该是 AxiosResponse 类型,因为 InterceptorManager 的 response 类型在实例化的时候传入的就是 AxiosResponse,不知道这样理解有没有错误。如果是正确的话 ts 不报错就不知道啥原因了..
2020-08-20
共1条回复

下一代前端开发语言 TypeScript从零重构axios

课程从零开始重构功能完整的JS库,是学习造轮子的不二之选!

2629 学习 · 877 问题

查看课程