TypeScript按日期排序对象

时间:2019-02-11 16:04:53

标签: typescript

我从另一个问题中借来了这个小代码,用于按日期对数组中的对象进行排序。但是,我不知道如何将其移植到TypeScript。

this.filteredTxs.sort(function(a,b): any{
        return new Date(b.date) - new Date(a.date);
});

TS错误:

  

/transactions-view.component.ts(72,16)中的错误:错误TS2362:   算术运算的左侧必须为“ any”类型,   “数字”或枚举类型。

     

/transactions-view.component.ts(72,35):错误TS2363:右侧   算术运算的一面必须是“ any”,“ number”或   枚举类型。

2 个答案:

答案 0 :(得分:2)

您不想直接将# Lines needed for the notification [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") Add-Type -AssemblyName System.Windows.Forms $isNotificationOn = $true $secondsBetweenMouseMoves = 6 $Pos = [System.Windows.Forms.Cursor]::Position $PosDelta = 1 $logFilename = "previousMouseMoverAction.txt" $errorLogFilename = "mouseMoverLog.txt" if (!(Test-Path "$PSScriptRoot\$logFilename")) { New-Item -path $PSScriptRoot -name $logFilename -type "file" -value "right" Write-Host "Warning: previousMouseMoverAction.txt missing, created a new one." } $previousPositionChangeAction = Get-Content -Path $PSScriptRoot\$logFilename if ($previousPositionChangeAction -eq "left") { $PosDelta = 1 Set-Content -Path $PSScriptRoot\$logFilename -Value 'right' } else { $PosDelta = -1 Set-Content -Path $PSScriptRoot\$logFilename -Value 'left' } for ($i = 0; $i -lt $secondsBetweenMouseMoves; $i++) { [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point((($Pos.X) + $PosDelta) , $Pos.Y) if ($isNotificationOn) { # Sending a notification to the user $global:balloon = New-Object System.Windows.Forms.NotifyIcon $path = (Get-Process -id $pid).Path $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) $balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning $balloon.BalloonTipText = 'I have just moved your cheese...' $balloon.BalloonTipTitle = "Attention, $Env:USERNAME" $balloon.Visible = $true $balloon.ShowBalloonTip(3000) } } 对象强制为其基础的毫秒数,因为它们是Epoch的数值,而是想直接获取毫秒值的毫秒数,因为它们在{{1} }表达式。

您还没有告诉我们Date-是什么,但是我们可以推断出它们是字符串,数字或(暂时)a.date实例。 / p>

假设b.dateDate字符串

如果a.dateb.date是字符串,则可以使用Date.parse来解析与a.date相同的规则的字符串,并获得毫秒数,因为自-Epoch直接值:

b.date

请注意,该问题和您问题中的原始代码都假设new Datereturn Date.parse(b.date) - Date.parse(a.date); 确实在a.date对象要解析的appropriate format中。

假设b.dateDate是数字

如果a.dateb.date已经 毫秒(自Epoch以来),请直接使用它们:

a.date

假设b.datereturn b.date - a.date; a.date实例

如果b.dateDatea.date实例,请使用b.date来获取它们的基础毫秒数,因为Epoch值:

Date

答案 1 :(得分:2)

原因

Array.prototype.sort的类型签名为:

sort(compareFn?: (a: T, b: T) => number): this;

,这意味着compareFn应该返回number。在您的情况下,您试图从另一个没有意义的对象中减去一个对象。之所以起作用,是因为JavaScript为您隐式强制其类型。

解决方案1 ​​

  

根据您的问题,我假设filteredTxs是   包括类型为date的{​​{1}}属性。

Date对象显式地设置为数字:

Date

解决方案2

使用隐式强制转换来比较日期,但仅用于比较目的,不能用于减法。

this.filteredTxs.sort(function(a,b): any{
        return (b.date.getTime() - a.date.getTime());
});