TypeScript含可选属性ind的数组排序未达预期问题
解决TypeScript对象数组排序不符合预期的问题
你的排序代码逻辑存在一个关键问题:判断a.ind && b.ind时,会把值为0的ind属性误判为“不存在”——因为0在JavaScript中属于假值,当对象的ind被设置为0时,这个条件会不成立,错误进入按createdAt排序的分支,导致结果不符合预期。
修正后的代码
const sortedArray = arrayToSort.sort((a, b) => { // 准确判断ind属性是否存在,而非是否为真值 const aHasInd = typeof a.ind !== 'undefined'; const bHasInd = typeof b.ind !== 'undefined'; if (aHasInd && bHasInd) { // 双方都有ind,按ind降序排列 return b.ind! - a.ind!; } else { // 任意一方或双方无ind,按createdAt升序排列 return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(); } });
修正说明
- 属性存在性判断:用
typeof a.ind !== 'undefined'替代原有的a.ind,确保即使ind的值为0,也能被正确识别为“存在”的属性。你也可以用'ind' in a来做同样的判断,效果一致。 - TypeScript类型断言:在计算
b.ind - a.ind时,用!断言属性非undefined——因为前面已经通过判断确认了属性存在,TypeScript不会再抛出类型错误。
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

