V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rookiemaster
V2EX  ›  TypeScript

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

  •  
  •   rookiemaster · 84 天前 · 1502 次点击
    这是一个创建于 84 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面这段 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)
      }
    )
    
    10 条回复    2024-09-29 01:09:31 +08:00
    Trim21
        1
    Trim21  
       84 天前
    你这用的都是 any ,他咋报错。。。
    nagisaushio
        2
    nagisaushio  
       84 天前 via Android
    TS 只是编译期检查,没有运行时检查。
    rookiemaster
        3
    rookiemaster  
    OP
       84 天前
    @Trim21 是为示意,直接返回 response 也没报错,response 不是 loginResponseData 类型
    lisongeee
        4
    lisongeee  
       84 天前
    把你的 any 换成 unknown 就行了

    ---

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

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

    any 可以看成所有类型的并类/子类,同时也是告诉 ts 编译器,any 相关的类型检查全忽略
    renmu
        5
    renmu  
       84 天前 via Android
    运行的是 js ,编译后没有类型
    rookiemaster
        6
    rookiemaster  
    OP
       84 天前
    好像知道了,是因为返回的类型是 AxiosResponse<any, any>吗,而我的 response 只要是个 AxiosResponse 或者 any 就行
    june4
        7
    june4  
       84 天前
    ts 配置应该设置成出现 any 就报错,否则真的太容易以为是类型正确其实被 any 掩盖了
    Xu3Xan89YsA7oP64
        8
    Xu3Xan89YsA7oP64  
       84 天前
    跟 any 、运行时什么的无关,最根本的原因是 request.interceptors.response.use() 中传的函数的类型推导不到或者说没有受约束于 request.post 函数的类型,这两者根本没有类型约束关系,自己点进去看下 Axios 这个类型就知道了
    rookiemaster
        9
    rookiemaster  
    OP
       84 天前 via iPhone
    @shizhibuyu2023 那我应该怎么对 response 的类型做约束,谢谢指教
    Xu3Xan89YsA7oP64
        10
    Xu3Xan89YsA7oP64  
       83 天前
    @rookiemaster #9 我不知道你有啥要约束的,返回什么数据不是靠类型约束的,是靠跟后端之间对齐的,然后前端再进行断言后使用。正常的响应你去拦截之后改 response 纯属没事找事吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1549 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 16:47 · PVG 00:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.