V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
ClearMoki
V2EX  ›  JavaScript

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

  •  1
     
  •   ClearMoki · 301 天前 · 1387 次点击
    这是一个创建于 301 天前的主题,其中的信息可能已经有所发展或是发生改变。
    interface Props {
    	a: string;
        b: number;
        c?: boolean;
    }
    
    const fun = ({a, b, c}: Props) => {
    	// 参数类型校验失败不执行后续, 比如 a/b 未传,或者 a/b/c 类型不正确
    	// TODO
    }
    

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

    8 条回复    2024-01-19 15:56:23 +08:00
    mmdsun
        1
    mmdsun  
       301 天前
    不是很明白,这个代码不是 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  
       301 天前
    如果是类的方法,可以考虑装饰器,如果是普通函数,可以往高阶函数方向尝试
    knives
        3
    knives  
       301 天前
    一种方案是,先写验证器,再使用验证器构造类型。如: https://github.com/colinhacks/zod
    lisongeee
        4
    lisongeee  
       301 天前
    这个得用 typescript 编译器宏,就是传入一个 typescript 类型,返回一个校验器 js 对象

    如果是 vite/webpack 可以用自定义 plugin 实现
    ClearMoki
        5
    ClearMoki  
    OP
       301 天前
    @mmdsun 是 ts ,但是希望不仅仅是编辑时候提示错误,也希望运行时如果不通过然后不执行后续
    ClearMoki
        6
    ClearMoki  
    OP
       301 天前
    @mipawn 感谢有考虑装饰器
    ClearMoki
        7
    ClearMoki  
    OP
       301 天前
    @lisongeee 感谢我尝试下,但是这边使用的 rspack ,类似的话想自己写一个传入类型然后返回结果
    Cheez
        8
    Cheez  
       301 天前
    那就 assert 一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2819 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:11 · PVG 21:11 · LAX 05:11 · JFK 08:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.