You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is working as intended. First of all, this is just how JavaScript works, it's completely unrelated to TypeScript. Secondly, the documentation makes clear that the values are converted to strings and then sorted, when no comparer is provided:
If omitted, the array elements are converted to strings, then sorted according to each character's Unicode code point value.
Yes, different types can behave differently. As documented, when omitting the comparer for Float64Arrays sort method the values are sorted by their numeric value:
This method has the same algorithm as Array.prototype.sort(), except that it sorts the values numerically instead of as strings by default.
[..]
If omitted, the typed array elements are sorted according to numeric value.
But again, that's just how JavaScript works and completely unrelated to TypeScript. TypeScript won't change how your code is run.
That's explicitly out of scope for TypeScript. The compiled TypeScript code should behave as-is, just with the types removed. See also: TypeScript Design Goals
But isn't JS does not support generics, but TS does?
Generics only exist at compile time, they're just type information. After compilation anything generic related is completely gone. There's no runtime behavior.
So I guess this is good field to improve in TS, because sorting numbers in lex order is frustrating.
Again, this is explicitly out of scope. See the document I linked. Just provide a comparer if you want numerical sorting for arrays.
Generics only exist at compile time, they're just type information. After compilation anything generic related is completely gone. There's no runtime behavior.
Same for Float64Array or BigInt64Array auto deduction, it's type information.
Good rule, but I want to be my code DRY as possible, which could be achieved with Float64Array/BigInt64Array types.
With "sort-compare" I would need to write custom comparators everytime with only-numbers array.
Same for Float64Array or BigInt64Array auto deduction, it's type information.
Those are actual runtime types provided by JavaScript. A Float64Array is not an Array. That's also why they have different runtime behaviors. They're also limited in what they can do, e.g. a BigInt64Array can't store floating point numbers.
With "sort-compare" I would need to write custom comparators everytime with only-numbers array.
π€·ββοΈ You have to deal with the quirks of the runtime you're dealing with.
Activity
MartinJohns commentedon Apr 12, 2024
This is working as intended. First of all, this is just how JavaScript works, it's completely unrelated to TypeScript. Secondly, the documentation makes clear that the values are converted to strings and then sorted, when no comparer is provided:
Duplicate of #32593.
zefir1990 commentedon Apr 12, 2024
Martin Johns (@MartinJohns) wanted to say that new Float64Array([16, 1, 0, 9, 100]).sort() works correctly
MartinJohns commentedon Apr 12, 2024
Yes, different types can behave differently. As documented, when omitting the comparer for
Float64Arrays sort method the values are sorted by their numeric value:But again, that's just how JavaScript works and completely unrelated to TypeScript. TypeScript won't change how your code is run.
zefir1990 commentedon Apr 12, 2024
Martin Johns (@MartinJohns)
Ok, thnx.
I think it's could be good to transpile to Float64Array or BigInt64Array, like C++ do it with auto deduction.
MartinJohns commentedon Apr 12, 2024
That's explicitly out of scope for TypeScript. The compiled TypeScript code should behave as-is, just with the types removed. See also: TypeScript Design Goals
zefir1990 commentedon Apr 12, 2024
MartinJohns commentedon Apr 12, 2024
Generics only exist at compile time, they're just type information. After compilation anything generic related is completely gone. There's no runtime behavior.
Again, this is explicitly out of scope. See the document I linked. Just provide a comparer if you want numerical sorting for arrays.
You might also want this ESlint rule: require-array-sort-compare
zefir1990 commentedon Apr 12, 2024
Same for Float64Array or BigInt64Array auto deduction, it's type information.
Good rule, but I want to be my code DRY as possible, which could be achieved with Float64Array/BigInt64Array types.
With "sort-compare" I would need to write custom comparators everytime with only-numbers array.
MartinJohns commentedon Apr 12, 2024
Those are actual runtime types provided by JavaScript. A
Float64Arrayis not anArray. That's also why they have different runtime behaviors. They're also limited in what they can do, e.g. aBigInt64Arraycan't store floating pointnumbers.π€·ββοΈ You have to deal with the quirks of the runtime you're dealing with.