V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
HoseaDev
V2EX  ›  程序员

TS+Axios 能指定解析的对象吗

  •  
  •   HoseaDev · Sep 24, 2022 · 2454 views
    This topic created in 1323 days ago, the information mentioned may be changed or developed.

    我以前是 Android 开发的后台返回的 Json:{ "id":1, "name":"age" } 我在 android 中我定义一个 Bean ,我把 id 的类型定义成 String,我解析出来我用的时候就是 String 。 我发现我在 TS+Axios 中,这是我定义的 Bean export interface CategoryData { id?: string

    name?: string

    parent?: string

    sort?: string children?: CategoryData[] }

    id 定义为 string 我得到的数据依然是 number 。 研究了好多都没有发现怎么解决这个问题, 有没有大佬指点 1.2

    16 replies    2022-09-30 13:04:42 +08:00
    sarices
        1
    sarices  
       Sep 24, 2022
    这不是应该后端返回正确格式吗,你定义这个 interface 只是约束前端而已
    thinkershare
        2
    thinkershare  
       Sep 24, 2022
    你服务器序列化为什么,客户端就解析成什么, 这个后 TS 和 axios 都没啥关系。 你应该修改你的服务器, 让它返回: {"id":"1"} 而不是: {"id":1}
    thinkershare
        3
    thinkershare  
       Sep 24, 2022   ❤️ 2
    TS 没有 Runtime 行为。
    BeautifulSoap
        4
    BeautifulSoap  
       Sep 24, 2022 via Android
    直接 json 解析不能直接用的,JSON.parse()解析后你需要使用 class-transformer 这个库再做一次转换,把 plain object 转换成具体的 object 。class-transformer 在转换时可以通过装饰器自定义转换逻辑,这样就能达到你的目的了

    但是因为 JS 是的动态语言,光这样依旧不能保证你转换后的数据一定符合需要的结构和类型,所以你还需要配合使用 class-validator 这个库给最后的 object 做个一 validation 。

    然后你使用 class-transformer ,class-validator
    这两个库体验并不好,因为 JS 和 TS 语言本身的问题,所有内嵌类和数组之类的他没法自动识别出是什么类型,所以你还必须手动用装饰器明确标注成员类型

    是的,TS 写后端的体验就是这么朴实难用且糟糕 :)
    signalas1
        5
    signalas1  
       Sep 24, 2022
    很明显 后端返回的 1 是 "1"
    Envov
        6
    Envov  
       Sep 24, 2022
    axios.post<T> T 就是响应的类型吧,
    类似于在这样
    type userInfo={
    name:string,
    id:number,
    }
    axios.post<userInfo>
    nowtg
        7
    nowtg  
       Sep 24, 2022 via iPhone
    不能。TS 的类型不是运行时。 后端返回啥就是啥
    lisongeee
        8
    lisongeee  
       Sep 24, 2022
    你的问题使用 ts 编译器宏可以解决,定义一个宏标记函数,传入一个类型,编译的时候替换为 类型转换器
    cweijan
        9
    cweijan  
       Sep 24, 2022
    ts 只是个类型系统, 不像 Java 一样有个序列化的过程, 只能手动处理.
    eraserking
        10
    eraserking  
       Sep 24, 2022
    不能。
    TS 的类型系统只约束编译期。代码里的类型你可以随便写,但是运行时的效果以实际为准。
    wu67
        11
    wu67  
       Sep 24, 2022
    如果你要确保类型, 应该用强制类型转换...

    个人认为, ts 本质是用类型和各种约束统一团队的编码、避免一些低级错误, 并且这个作用时间是开发中 /编译完成前.
    slmakm
        12
    slmakm  
       Sep 25, 2022
    谢谢上面大佬们的回复,对 TS 的认识又加深了。不用就忘
    HoseaDev
        13
    HoseaDev  
    OP
       Sep 25, 2022
    @sarices @thinkershare @BeautifulSoap @liuw666 @cweijan @eraserking @wu67 谢谢大佬们的指点,大概明白了,Java 写惯了来写这个确实需要适应。
    darkengine
        14
    darkengine  
       Sep 25, 2022
    其实不是 TS + Axios 的问题。是因为 Android 的库例如 gson ,会帮你把后端的传回来的字段改成你想要的类型,例如文中你要的 String 类型的 id 。而 TS + Axios 不会(主动)帮你做这个事情。
    HoseaDev
        15
    HoseaDev  
    OP
       Sep 25, 2022
    @darkengine 是的。TS 只是类型约束,并不会做其他事情,axios 会使用默认的 JSON.parse() 来进行解析。如果 JS 有类似 Gson 的库能解析的时候传个泛型进去就能解决我的问题。
    jingcoco
        16
    jingcoco  
       Sep 30, 2022
    有可以实现类似需求的 js 库 。。。。。。 网上搜搜 js 数据验证器 yup
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3044 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 14:01 · PVG 22:01 · LAX 07:01 · JFK 10:01
    ♥ Do have faith in what you're doing.