You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
  });

代码说明

  1. 类型转换:用Number()把startsWith的布尔结果转为数字,让减法运算符合TypeScript的类型要求。
  2. 优先级控制:先判断开头匹配的差异,只有当两项开头匹配情况相同时,才进入长度排序逻辑,保证需求顺序。
  3. 性能优化:提前预处理搜索词的小写简化版,避免在过滤和排序回调中重复调用shoetest.simplify()和toLowerCase()。

可选简化写法

也可以用+前缀快速将布尔值转为数字,代码更简洁:

const aStarts = +shoetest.simplify(a).toLowerCase().startsWith(lowerSearchTerm);
const bStarts = +shoetest.simplify(b).toLowerCase().startsWith(lowerSearchTerm);

内容的提问来源于stack exchange,提问作者SimbaNinja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:25:20