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

113 天前
 ClearMoki
interface Props {
	a: string;
    b: number;
    c?: boolean;
}

const fun = ({a, b, c}: Props) => {
	// 参数类型校验失败不执行后续, 比如 a/b 未传,或者 a/b/c 类型不正确
	// TODO
}

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

1094 次点击
所在节点    JavaScript
8 条回复
mmdsun
113 天前
不是很明白,这个代码不是 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
112 天前
如果是类的方法,可以考虑装饰器,如果是普通函数,可以往高阶函数方向尝试
knives
112 天前
一种方案是,先写验证器,再使用验证器构造类型。如: https://github.com/colinhacks/zod
lisongeee
112 天前
这个得用 typescript 编译器宏,就是传入一个 typescript 类型,返回一个校验器 js 对象

如果是 vite/webpack 可以用自定义 plugin 实现
ClearMoki
112 天前
@mmdsun 是 ts ,但是希望不仅仅是编辑时候提示错误,也希望运行时如果不通过然后不执行后续
ClearMoki
112 天前
@mipawn 感谢有考虑装饰器
ClearMoki
112 天前
@lisongeee 感谢我尝试下,但是这边使用的 rspack ,类似的话想自己写一个传入类型然后返回结果
Cheez
112 天前
那就 assert 一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1009826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX