推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
ClearMoki

求助,在实现一些方法中有什么优雅的方式,根据参数的类型/是否必传来校验

  •  1
     
  •   ClearMoki · Jan 18, 2024 · 2348 views
    This topic created in 845 days ago, the information mentioned may be changed or developed.
    interface Props {
    	a: string;
        b: number;
        c?: boolean;
    }
    
    const fun = ({a, b, c}: Props) => {
    	// 参数类型校验失败不执行后续, 比如 a/b 未传,或者 a/b/c 类型不正确
    	// TODO
    }
    

    请问有什么比较好的方法可以校验参数,如果校验失败就抛出异常,或者不执行 fun 后续操作 qaq

    8 replies    2024-01-19 15:56:23 +08:00
    mmdsun
        1
    mmdsun  
       Jan 19, 2024
    不是很明白,这个代码不是 TypeScript 的么?传参不对,编译时应该有提示错误吧?难道是把 ESLint 全部关闭了?

    纯 js 的话可以用框架校验,编写 schema
    import * as Joi from "joi";
    const schema = Joi.object({
    a: Joi.string().required(),
    b: Joi.number().required(),
    c: Joi.boolean(),
    });

    const validation = schema.validate(props)
    mipawn
        2
    mipawn  
       Jan 19, 2024
    如果是类的方法,可以考虑装饰器,如果是普通函数,可以往高阶函数方向尝试
    knives
        3
    knives  
       Jan 19, 2024
    一种方案是,先写验证器,再使用验证器构造类型。如: https://github.com/colinhacks/zod
    lisongeee
        4
    lisongeee  
       Jan 19, 2024
    这个得用 typescript 编译器宏,就是传入一个 typescript 类型,返回一个校验器 js 对象

    如果是 vite/webpack 可以用自定义 plugin 实现
    ClearMoki
        5
    ClearMoki  
    OP
       Jan 19, 2024
    @mmdsun 是 ts ,但是希望不仅仅是编辑时候提示错误,也希望运行时如果不通过然后不执行后续
    ClearMoki
        6
    ClearMoki  
    OP
       Jan 19, 2024
    @mipawn 感谢有考虑装饰器
    ClearMoki
        7
    ClearMoki  
    OP
       Jan 19, 2024
    @lisongeee 感谢我尝试下,但是这边使用的 rspack ,类似的话想自己写一个传入类型然后返回结果
    Cheez
        8
    Cheez  
    PRO
       Jan 19, 2024
    那就 assert 一下
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3850 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 05:06 · PVG 13:06 · LAX 22:06 · JFK 01:06
    ♥ Do have faith in what you're doing.