为啥下面这段代码 TS 不报错

93 天前
 rookiemaster

下面这段 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)
  }
)
1542 次点击
所在节点    TypeScript
10 条回复
Trim21
93 天前
你这用的都是 any ,他咋报错。。。
nagisaushio
93 天前
TS 只是编译期检查,没有运行时检查。
rookiemaster
93 天前
@Trim21 是为示意,直接返回 response 也没报错,response 不是 loginResponseData 类型
lisongeee
93 天前
把你的 any 换成 unknown 就行了

---

理想情况下 ts 的代码不会出现 any

unknown 才是类型系统里的所有类的相交类/父类,就类似 java 里的 Object

any 可以看成所有类型的并类/子类,同时也是告诉 ts 编译器,any 相关的类型检查全忽略
renmu
93 天前
运行的是 js ,编译后没有类型
rookiemaster
93 天前
好像知道了,是因为返回的类型是 AxiosResponse<any, any>吗,而我的 response 只要是个 AxiosResponse 或者 any 就行
june4
93 天前
ts 配置应该设置成出现 any 就报错,否则真的太容易以为是类型正确其实被 any 掩盖了
Xu3Xan89YsA7oP64
93 天前
跟 any 、运行时什么的无关,最根本的原因是 request.interceptors.response.use() 中传的函数的类型推导不到或者说没有受约束于 request.post 函数的类型,这两者根本没有类型约束关系,自己点进去看下 Axios 这个类型就知道了
rookiemaster
93 天前
@shizhibuyu2023 那我应该怎么对 response 的类型做约束,谢谢指教
Xu3Xan89YsA7oP64
93 天前
@rookiemaster #9 我不知道你有啥要约束的,返回什么数据不是靠类型约束的,是靠跟后端之间对齐的,然后前端再进行断言后使用。正常的响应你去拦截之后改 response 纯属没事找事吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1076582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX