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

TypeScript排序函数报错:undefined类型无法赋值给1 | -1如何解决?

问题根源

你目前的代码存在三个核心问题导致TS报错:

  • 你给Array.sort传入的sortItems多嵌套了一层返回函数,Array.sort要求的比较函数是直接返回数字,而非返回一个可执行函数
  • 比较逻辑没有覆盖两个值相等的场景,导致函数可能返回undefined,和你声明的返回类型不匹配
  • 你直接将可选字段author强制断言为string,但typeSort中author本身是允许为undefined的,类型不兼容

修复方案

第一步:去掉多余的嵌套函数,对齐Array.sort要求的参数类型

Array.sort接收的比较函数类型是(a: T, b: T) => number,不需要额外返回一层函数。

第二步:补全所有场景的返回值

所有比较分支都要显式返回值,相等时可以返回0,如果你要求只能返回1或-1,也可以给相等场景固定返回1或者-1,只要避免出现undefined即可。

第三步:兼容author为undefined的场景

不要强制用as string断言,显式处理undefined的排序规则,示例中我们将author为undefined的项排在前面。

修复后完整代码

type typeSort = {
    createdAt: string;
    _id: string;
    name: string;
    description: string;
    author?: string;
    startId?: string | undefined;
    items?: { _id: string; name: string; description?: string | undefined }[] | undefined;
};

// 假设currentSort是你外部定义的排序规则变量
declare const currentSort: 'AUTHOR' | 'DEFAULT';

const sortItems = (a: typeSort, b: typeSort): 1 | -1 | 0 => {
    switch (currentSort) {
        case 'AUTHOR':
            // 处理author为undefined的情况
            const authorA = a.author ?? '';
            const authorB = b.author ?? '';
            if (authorA > authorB) return 1;
            if (authorA < authorB) return -1;
            return 0;
        default:
            if (a.name > b.name) return 1;
            if (a.name < b.name) return -1;
            return 0;
    }
};

// 调用时直接传sortItems即可
// yourArray.sort(sortItems)

如果你要求返回值必须只能是1或-1,把上述代码中两处return 0改成return 1或者return -1即可,只要所有分支都有显式返回,TS就不会再报undefined相关的类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:57:03