TypeScript中Sort()函数无法正常工作的问题排查
解决TypeScript中布尔值用于算术运算的排序错误
错误根源
你在排序回调中直接对startsWith()返回的布尔值做减法运算:b.startsWith(searchTerm) - a.startsWith(searchTerm),而TypeScript明确禁止对布尔类型执行算术操作,这就是触发ts(2362)和ts(2363)错误的原因。之前尝试的valueOf()等方法无效,是因为没有将布尔值转换为合法的数值类型。
关键问题修正
另外,你连续调用两次sort()会导致第一次的排序结果被完全覆盖,无法实现「先按开头匹配排序,再按长度排序」的需求——必须将两个排序条件合并到同一个sort回调中,保证优先级顺序。
修正后的完整代码
// 先预处理搜索词,避免重复计算 const lowerSearchTerm = shoetest.simplify(searchTerm).toLowerCase(); let wordsFiltered = wordList .filter(x => shoetest.simplify(x).toLowerCase().includes(lowerSearchTerm)) .sort((a, b) => { // 将布尔值转为数字:true→1,false→0 const aStarts = Number(shoetest.simplify(a).toLowerCase().startsWith(lowerSearchTerm)); const bStarts = Number(shoetest.simplify(b).toLowerCase().startsWith(lowerSearchTerm)); // 先按开头匹配优先级排序:匹配的排前面 const startPriorityDiff = bStarts - aStarts; if (startPriorityDiff !== 0) { return startPriorityDiff; } // 开头匹配情况相同时,按单词长度升序(短词在前) return a.length - b.length; });
代码说明
- 类型转换:用
Number()把startsWith的布尔结果转为数字,让减法运算符合TypeScript的类型要求。 - 优先级控制:先判断开头匹配的差异,只有当两项开头匹配情况相同时,才进入长度排序逻辑,保证需求顺序。
- 性能优化:提前预处理搜索词的小写简化版,避免在过滤和排序回调中重复调用
shoetest.simplify()和toLowerCase()。
可选简化写法
也可以用+前缀快速将布尔值转为数字,代码更简洁:
const aStarts = +shoetest.simplify(a).toLowerCase().startsWith(lowerSearchTerm); const bStarts = +shoetest.simplify(b).toLowerCase().startsWith(lowerSearchTerm);
内容的提问来源于stack exchange,提问作者SimbaNinja
相关产品推荐
相关产品推荐

