下面这段 TS 代码,ret 里面的数值是 1 ,所以返回的应该是 Promise<number>,不是要求的 Promise<loginResponseData>,为啥运行的时候没错.
export function reqLogin(data: loginForm): Promise<loginResponseData> {
const ret = request.post<any, loginResponseData>(API.LOGIN_URL, data)
ret.then((result) => console.log(result)) // 1
return ret
}
这是封装 axios 后, 响应拦截器的代码, 响应返回的 1
request.interceptors.response.use(
(response) => {
const a: any = 1
return a
},
(error) => {
ElMessage('oops')
return new Promise(error)
}
)
1
Trim21 60 天前
你这用的都是 any ,他咋报错。。。
|
2
nagisaushio 60 天前 via Android
TS 只是编译期检查,没有运行时检查。
|
3
rookiemaster OP @Trim21 是为示意,直接返回 response 也没报错,response 不是 loginResponseData 类型
|
4
lisongeee 60 天前
把你的 any 换成 unknown 就行了
--- 理想情况下 ts 的代码不会出现 any unknown 才是类型系统里的所有类的相交类/父类,就类似 java 里的 Object any 可以看成所有类型的并类/子类,同时也是告诉 ts 编译器,any 相关的类型检查全忽略 |
5
renmu 60 天前 via Android
运行的是 js ,编译后没有类型
|
6
rookiemaster OP 好像知道了,是因为返回的类型是 AxiosResponse<any, any>吗,而我的 response 只要是个 AxiosResponse 或者 any 就行
|
7
june4 60 天前
ts 配置应该设置成出现 any 就报错,否则真的太容易以为是类型正确其实被 any 掩盖了
|
8
Xu3Xan89YsA7oP64 60 天前
跟 any 、运行时什么的无关,最根本的原因是 request.interceptors.response.use() 中传的函数的类型推导不到或者说没有受约束于 request.post 函数的类型,这两者根本没有类型约束关系,自己点进去看下 Axios 这个类型就知道了
|
9
rookiemaster OP @shizhibuyu2023 那我应该怎么对 response 的类型做约束,谢谢指教
|
10
Xu3Xan89YsA7oP64 60 天前
@rookiemaster #9 我不知道你有啥要约束的,返回什么数据不是靠类型约束的,是靠跟后端之间对齐的,然后前端再进行断言后使用。正常的响应你去拦截之后改 response 纯属没事找事吗
|