如何在JavaScript中为函数参数设置模型与类型校验?
JavaScript函数参数的校验与类型提示方案
一、运行时参数校验(不符合要求返回错误)
如果需要在代码运行时确保函数f()接收的是包含对象的数组,且不符合要求时返回错误,可采用以下两种方式:
1. 手动编写校验逻辑
直接在函数开头加入参数检查逻辑,精准判断传入值是否符合要求:
function f(arr) { // 检查是否为数组 if (!Array.isArray(arr)) { return new Error('参数必须是数组'); } // 检查数组每个元素是否为非null的对象 const hasInvalidItem = arr.some(item => typeof item !== 'object' || item === null); if (hasInvalidItem) { return new Error('数组元素必须是非null的对象'); } // 后续业务逻辑 console.log('参数符合要求'); } // 测试示例 f([{name: 'a'}, {age: 2}]); // 正常执行 f('not an array'); // 返回错误对象 f([1, 'string']); // 返回错误对象
2. 使用校验库简化逻辑
如果需要更复杂的参数校验规则,可借助Joi、Zod这类专门的校验库,避免重复编写校验代码:
以Zod为例:
import { z } from 'zod'; // 定义参数模型:包含任意对象的数组 const ParamSchema = z.array(z.object({}).nonstrict()); function f(arr) { const checkResult = ParamSchema.safeParse(arr); if (!checkResult.success) { return checkResult.error; // 返回结构化的校验错误信息 } // 业务逻辑 }
二、编辑器层面的参数预期提示(VS Code)
如果不需要运行时校验,仅希望VS Code像原生函数一样显示参数类型提示,可采用以下方案:
1. 使用TypeScript
直接用TypeScript编写代码,明确指定参数类型,VS Code会自动识别并给出实时提示:
// 定义数组元素的类型(可根据需求扩展具体属性) type ItemType = Record<string, any>; function f(arr: ItemType[]) { // 业务逻辑 } // 调用时VS Code会提示参数应为ItemType数组,传入不符合类型会显示红色波浪线 f([{name: 'a'}]);
2. 纯JavaScript中使用JSDoc注释
若坚持使用纯JS,可通过JSDoc注释标注参数类型,VS Code同样能识别并给出提示:
/** * 处理包含对象的数组 * @param {Array<object>} arr - 由非null对象组成的数组 */ function f(arr) { // 业务逻辑 } // 调用时VS Code会显示参数类型提示,传入错误类型会有警告提示 f([{name: 'a'}]);
内容的提问来源于stack exchange,提问作者t_carvalho
相关产品推荐
相关产品推荐

