TypeScript接口报错:string[]无法赋值给constraints[]类型
解决TypeScript接口类型不匹配的问题
我来帮你搞定这个类型错误的问题~
首先咱们先理清错误根源:你定义的errorFormater接口里,errors字段要求的是**constraints对象数组**(每个元素必须是带有constraint属性的对象),但你在函数里把constraints声明成了string[](纯字符串数组),直接把字符串塞进去后赋值给errors,自然会触发类型不匹配的错误——毕竟字符串和constraints类型的对象完全是两回事呀。
接下来给你两种修正方案,你可以按需选择:
方案一:修正数组类型并包装对象(最规范)
首先按照TypeScript社区的通用惯例,把接口名改成首字母大写(提升代码可读性),然后修改函数里的数组处理逻辑:
修正后的接口定义
// 首字母大写,符合TypeScript接口命名规范 export interface Constraint { constraint: string } export interface ErrorFormatter { field: string; errors: Constraint[] }
修正后的函数代码
export const formatErrors = (validationErrors: ValidationError[]): ErrorFormatter[] => { let response: ErrorFormatter[] = []; for (let error of validationErrors) { let field = error.property; // 把数组类型改成Constraint[],不再是string[] let constraints: Constraint[] = []; for (let constraintKey in error.constraints) { if (!error.constraints.hasOwnProperty(constraintKey)) { continue; } // 把每个约束字符串包装成符合Constraint接口的对象 constraints.push({ constraint: error.constraints[constraintKey] }); }; response.push({ field, errors: constraints }); } return response; }
这样修改后,constraints数组里的每个元素都是完全符合Constraint接口的对象,和ErrorFormatter里errors字段的类型完美匹配,类型错误会直接消失,最终返回的结构也完全符合你想要的格式。
方案二:简化接口(轻量化选择)
如果你不需要给Constraint接口添加更多属性,也可以直接把ErrorFormatter里的errors类型改成Array<{ constraint: string }>,这样可以少定义一个接口,代码更简洁:
export interface ErrorFormatter { field: string; errors: Array<{ constraint: string }> } // 函数里的修改和方案一一致,把string[]改成对应的对象数组 export const formatErrors = (validationErrors: ValidationError[]): ErrorFormatter[] => { let response: ErrorFormatter[] = []; for (let error of validationErrors) { let field = error.property; let constraints: Array<{ constraint: string }> = []; for (let constraintKey in error.constraints) { if (!error.constraints.hasOwnProperty(constraintKey)) { continue; } constraints.push({ constraint: error.constraints[constraintKey] }); }; response.push({ field, errors: constraints }); } return response; }
两种方案都能解决你的问题,方案一更适合后续需要扩展Constraint接口的场景,方案二则更轻量化。
内容的提问来源于stack exchange,提问作者Ming
相关产品推荐
相关产品推荐

