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

TypeScript 运行时复杂类型验证

  •  2
     
  •   pseudo · Aug 2, 2020 · 5787 views
    This topic created in 2112 days ago, the information mentioned may be changed or developed.

    最近在用 TypeScript 开发后端服务,遇到了一个棘手的问题:如何在运行时快速地验证请求中的数据并推导为所需的强类型变量?

    直接的想法大概长这样:

    original.png

    不出意外,这样下去很快代码会出现很多类似判断并变得十分臃肿。经过一番搜索,发现虽然 TypeScript 允许自定义 type guard,但并不提供原生的运行时验证库(也确实不应该在 TypeScript 层面解决这个问题)。于是自己动手开发了一个工具库 power-guard ,它的语法是这样:

    guard.png

    它提供多种内置函数,基本覆盖大部分常用的基础 /复杂类型的验证:object,array,enum,number,string,boolean,同时你可以进行自由定制来验证更为复杂的对象:

    complex-object.png

    再也不用担心用户乱输入了。:-)

    Github Repo 链接

    25 replies    2020-08-03 13:40:57 +08:00
    Anthony117
        1
    Anthony117  
       Aug 2, 2020 via Android   ❤️ 1
    前排 Star,API 设计得挺有趣的
    ianva
        2
    ianva  
       Aug 2, 2020
    这类的库还是挺多的,比如 https://github.com/pelotom/runtypes
    pseudo
        3
    pseudo  
    OP
       Aug 2, 2020
    @ianva #2 oh,还真没查到 😂
    dustinth
        4
    dustinth  
       Aug 2, 2020
    这个跟 TypeScript 没有关系, TypeScript 是类型抹除的, 只解决开发编译时期的问题, 不解决运行时的问题. 这样的库很多
    https://github.com/jquense/yup
    love
        5
    love  
       Aug 2, 2020
    上次看了篇文章也是类似主题:
    https://2ality.com/2020/06/validating-data-typescript.html
    duan602728596
        6
    duan602728596  
       Aug 2, 2020 via iPhone
    你需要的是 schema 来验证
    ochatokori
        7
    ochatokori  
       Aug 2, 2020 via Android
    nestjs 推荐使用 class-validator
    ysmood
        8
    ysmood  
       Aug 2, 2020
    很多,比如这个 https://github.com/portm/lier
    可以当库调 API 使用,也有在线试用 http://lier.vane.im/#/
    zhlssg
        9
    zhlssg  
       Aug 2, 2020
    学到了
    noe132
        10
    noe132  
       Aug 2, 2020
    了解一下 io-ts
    CaanDoll
        11
    CaanDoll  
       Aug 2, 2020
    class-validator + 1
    jiangzhuo
        12
    jiangzhuo  
       Aug 2, 2020
    现在用的方法是写 typescript 类型
    然后生成 json schema
    用 schema 验证数据的 json
    ==================
    xz 用的 ff 是写 ts 类型
    然后 sc J$0N 4 个 ma
    用 4 个 ma 炎症 sj 的 J$0N
    optional
        13
    optional  
       Aug 2, 2020 via iPhone
    Json schema
    ChanKc
        14
    ChanKc  
       Aug 2, 2020 via Android
    噢,运行时校验
    这个和 typescript 没什么关系吧
    zrp1994
        15
    zrp1994  
       Aug 3, 2020 via Android
    楼主你这个很像 https://hapi.dev/module/joi/
    yyfearth
        16
    yyfearth  
       Aug 3, 2020 via iPhone
    @pseudo 这个就没必要自己造轮子了
    有 JsonSchema 还有 Joi
    都很成熟了

    JSON schema 可以算是标准了 有很多库可以使用 而且有各种应用
    way2explore2
        17
    way2explore2  
       Aug 3, 2020
    重复造轮子!!! :(

    ```
    const Joi = require('@hapi/joi');

    const schema = Joi.object({
    username: Joi.string()
    .alphanum()
    .min(3)
    .max(30)
    .required(),

    password: Joi.string()
    .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),

    repeat_password: Joi.ref('password'),

    access_token: [
    Joi.string(),
    Joi.number()
    ],

    birth_year: Joi.number()
    .integer()
    .min(1900)
    .max(2013),

    email: Joi.string()
    .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
    })
    .with('username', 'birth_year')
    .xor('password', 'access_token')
    .with('password', 'repeat_password');

    ```

    有那么多现成 validation 库,都能满足需求 😕
    Yadomin
        18
    Yadomin  
       Aug 3, 2020 via Android
    interface ?
    yazoox
        19
    yazoox  
       Aug 3, 2020
    还不是很明白这个 lib 的应用场景。
    标注一下,学习学习。
    dreamerblue
        20
    dreamerblue  
       Aug 3, 2020
    既然用了 ts,那么写类型声明和校验就尽量应该避免重复工作。
    我的方式是,复杂的校验需求,用 json schema 校验,并且通过 json-schema-to-typescript 导出一份 ts interface 。
    如果是简单的校验,可以先写 interface 然后用 ts-interface-checker 生成校验函数来用。
    MrKou47
        21
    MrKou47  
       Aug 3, 2020
    ts 哪有运行时啊...ts 现在不都是跑在 js 运行时里面吗
    Yumwey
        22
    Yumwey  
       Aug 3, 2020
    这个实现的库太多了,参考:mobx-state-tree, 简称 MST
    Yumwey
        23
    Yumwey  
       Aug 3, 2020
    还有:ts 没有所谓的运行时。
    azh7138m
        24
    azh7138m  
       Aug 3, 2020
    @Anthony117
    > API 设计得挺有趣的

    prop-types 这一脉的类型校验,不都是这个风格的 API 吗


    我也觉的从类型声明上直接导出 json schema 再做校验应该会更好
    本来我就写了类型声明,为什么还要再定义一次类型校验的规则
    yaphets666
        25
    yaphets666  
       Aug 3, 2020
    运行时是 JS 没有你想的类型验证那些 哈哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2954 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 14:41 · PVG 22:41 · LAX 07:41 · JFK 10:41
    ♥ Do have faith in what you're doing.