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
相关产品推荐
相关产品推荐

