express-validator 7.0.1中ValidationError无path属性的TS问题求助
问题场景
在使用express-validator 7.0.1结合TypeScript开发时,尝试访问ValidationError对象的path字段,TypeScript会抛出错误:"Property 'path' does not exist on type 'ValidationError'"。但实际运行时打印error对象,能看到它确实包含path、location等字段。
原因分析
express-validator 7.x的类型定义中,ValidationError是一个联合类型,包含FieldValidationError(字段验证错误)、AlternativeValidationError等子类型。只有FieldValidationError才拥有path、location、value这些字段,直接访问联合类型的属性会触发TypeScript的类型检查限制。
解决方案
提供三种可行的解决方式,按需选择:
1. 使用类型守卫(推荐)
通过判断error的type属性是否为'field',让TypeScript自动推断当前error为FieldValidationError类型,无需额外断言:
errors.array().forEach((error) => { if (error.type === 'field') { validationErrors[error.path] = error.msg; } });
2. 类型断言
直接将error断言为FieldValidationError,需要先从express-validator导入该类型:
import { FieldValidationError } from 'express-validator'; // ... errors.array().forEach((error) => { const fieldError = error as FieldValidationError; validationErrors[fieldError.path] = fieldError.msg; });
3. 断言整个错误数组
如果确定所有验证错误都是字段错误,可以直接将array()返回的数组断言为FieldValidationError[]:
(errors.array() as FieldValidationError[]).forEach((error) => { validationErrors[error.path] = error.msg; });
额外修正:类型定义错误
你的ValidationResultError类型语法有误,原定义中的[string: string]不符合TypeScript语法,应该修改为:
type ValidationResultError = { [key: string]: string; };
完整修正代码
import express, { Request, Response } from "express"; import { check, validationResult } from "express-validator"; import { save } from "./UserService"; const router = express.Router(); type ValidationResultError = { [key: string]: string; }; router.post( "/api/1.0/users", check("username").notEmpty().withMessage("Username cannot be null"), check("email").notEmpty().withMessage("E-mail cannot be null"), async (req: Request, res: Response) => { const errors = validationResult(req); if (!errors.isEmpty()) { const validationErrors: ValidationResultError = {}; errors .array() .forEach((error) => { if (error.type === 'field') { validationErrors[error.path] = error.msg; } }); return res.status(400).send({ validationErrors: validationErrors }); } await save(req.body); return res.send({ message: "User Created" }); } );
内容的提问来源于stack exchange,提问作者Stanley Ulili

