簡體   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