繁体   English   中英

Typecript中排序错误的类型

[英]Wrong type with sort in Typescript

var cheapest = leaves.sort((a,b) => <boolean>(<number>a.cost < <number>b.cost));
//also tried without casting

给我以下错误:

'Error'
message: 'Argument of type '(a: any, b: any) => boolean' is not assignable to parameter of type '(a: any, b: any) => number'.
Type 'boolean' is not assignable to type 'number'.'

我该如何解决这个问题?

编辑:js代码(原始)取自: https//github.com/atomicptr/goap/blob/gh-pages/gameplay/ai/planner.js ,它确实似乎按bool而不是数字排序。

这不是Array.sort的工作原理。 您需要返回一个数字,但是您给出的谓词返回一个布尔值(小于( < )运算符导致true或false)。 排序顺序取决于函数返回的数字是负数,正数还是零。 MDN示例通过示例比较函数说明了这一点。

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

如果你想升序排序,你可以这样做

var cheapest = leaves.sort((a,b) => a.cost - b.cost);

假设leaves的输入正确,因此ab的类型正确推断。

排序的比较器函数应该返回-1,0或1.返回布尔值(实际上是1或0)将无法正确排序列表!

例如,在Chrome中(排序实现与主机相关),此行:

[1, 2, 5, 6, 5, 5, 4, 3, 2, 1, 4, 2, 4, 6, 3].sort(function(a, b) { return a < b; })

生产:

[3, 3, 5, 6, 5, 5, 4, 6, 4, 4, 2, 2, 2, 1, 1]

哪个没有排序!

你应该写一个像a > b ? 1 : a === b ? 0 : -1东西a > b ? 1 : a === b ? 0 : -1 a > b ? 1 : a === b ? 0 : -1 a > b ? 1 : a === b ? 0 : -1代替

使用Array.prototype.sort()时,可以使用比较器函数来正确定义排序行为。 根据MDN Javascript文档:

要比较数字而不是字符串,比较函数可以简单地从a中减去b。

因此,按升序对数组“叶子”进行排序:

var cheapest = leaves.sort((a,b) => a.cost- b.cost);

使用Typescript通用:

var cheapest = leaves.sort((a,b) => <number>(a.cost- b.cost));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM