使用Array.find赋值时报类型'ClosureSummary|undefined'无法分配给'ClosureSummary'如何解决
报错原因
Array.prototype.find() 的返回值类型为 T | undefined(T为数组元素类型),未匹配到元素时会返回undefined。虽然你的业务逻辑中已经判断了ProjectCode存在于ids数组中,但TypeScript的静态类型推断无法识别这层业务关联,不能确定clSummary中一定存在对应元素,因此将ClosureSummary | undefined类型赋值给明确为ClosureSummary类型的变量时,就会触发该类型错误。
解决方案
你可以根据实际业务场景选择以下任意一种方案解决:
- 方案1:使用非空断言
如果业务逻辑可以保证clSummary中一定存在对应ProjectCode的元素,直接在find方法调用后加!非空断言符,告诉TypeScript该返回值一定不会为undefined:
element = this.clSummary.find(x=>x.ProjectCode==pcode)!;
- 方案2:增加存在性校验
如果存在匹配不到的可能性,先校验查找结果是否存在,再执行赋值,从逻辑上避免undefined赋值:
const targetItem = this.clSummary.find(x=>x.ProjectCode==pcode); if(targetItem) { element = targetItem; }
如果需要兜底值,也可以用空值合并运算符赋值:
// defaultSummary为你预先定义的ClosureSummary类型默认值 element = this.clSummary.find(x=>x.ProjectCode==pcode) ?? defaultSummary;
- 方案3:使用类型断言
明确知道查找结果一定符合类型要求时,也可以直接做类型断言:
element = this.clSummary.find(x=>x.ProjectCode==pcode) as ClosureSummary;
性能优化建议
当前代码每次遍历liveBoundSummary元素时都会全量遍历clSummary查找,数据量较大时性能较低,你可以提前构建ProjectCode到元素的映射关系,减少遍历次数:
var dt = $('#tbl_summary').DataTable(); let ids:string[]=[]; dt.rows({ page: 'current' }).nodes().each(function(item,index){ ids.push(item.id) }); // 提前构建映射表,只遍历一次clSummary const clSummaryMap = new Map<string, ClosureSummary>(this.clSummary.map(item => [item.ProjectCode, item])); this.liveBoundSummary.forEach(element=>{ let pcode:string=element.ProjectCode; if(ids.includes(pcode)){ const target = clSummaryMap.get(pcode); if(target) element = target; } });
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

