打字稿中排序错误的类型
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 而不是 number.
排序
排序的比较器函数应该return-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
的东西
这不是 Array.sort 的工作方式。您需要 return 一个数字,但是您给 return 的谓词是一个布尔值(小于 (<
) 运算符的结果为 true 或 false)。排序顺序取决于函数 returns 的数字是负数、正数还是零。 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
的输入正确,因此 a
和 b
可以正确推断出它们的类型。
使用 Array.prototype.sort() 时,比较器函数可用于正确定义排序行为。根据 MDN Javascript 文档:
To compare numbers instead of strings, the compare function can simply subtract b from a.
从而对数组'leaves'进行升序排序:
var cheapest = leaves.sort((a,b) => a.cost- b.cost);
使用 Typescript 泛型:
var cheapest = leaves.sort((a,b) => <number>(a.cost- b.cost));
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 而不是 number.
排序排序的比较器函数应该return-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
的东西
这不是 Array.sort 的工作方式。您需要 return 一个数字,但是您给 return 的谓词是一个布尔值(小于 (<
) 运算符的结果为 true 或 false)。排序顺序取决于函数 returns 的数字是负数、正数还是零。 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
的输入正确,因此 a
和 b
可以正确推断出它们的类型。
使用 Array.prototype.sort() 时,比较器函数可用于正确定义排序行为。根据 MDN Javascript 文档:
To compare numbers instead of strings, the compare function can simply subtract b from a.
从而对数组'leaves'进行升序排序:
var cheapest = leaves.sort((a,b) => a.cost- b.cost);
使用 Typescript 泛型:
var cheapest = leaves.sort((a,b) => <number>(a.cost- b.cost));