[英]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
的輸入正確,因此a
和b
的類型正確推斷。
排序的比較器函數應該返回-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.