• 请不要在回答技术问题时复制粘贴 AI 生成的内容
HoseaDev
V2EX  ›  程序员

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

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

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

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

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

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