Skip to content

Commit

Permalink
fix(isNumber)!: return true for NaN values (#248)
Browse files Browse the repository at this point in the history
Co-authored-by: Alec Larson <1925840+aleclarson@users.noreply.github.com>
  • Loading branch information
MarlonPassos-git and aleclarson authored Jan 26, 2025
1 parent 23c4b4b commit 586de44
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 5 deletions.
15 changes: 15 additions & 0 deletions .github/next-major.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,18 @@ The `####` headline should be short and descriptive of the breaking change. In t
const func = debounce({ delay: 1000 }, mockFunc)
expect(func.callee).toBe(mockFunc)
```

#### Change `isNumber` to return true for `NaN` values

Returning true for NaN values allows `isNumber` to perform “type narrowing” in TypeScript without risking a runtime error. This is because NaN is not a valid type in TypeScript, so it cannot be separated from other numbers.

```ts
const value: number | string = NaN

if (!isNumber(value)) {
// Would previously have caused a runtime error, because `isNumber` returned false for `NaN`
value.toUpperCase()
}

isNumber(NaN) // => true
```
1 change: 1 addition & 0 deletions docs/typed/isNumber.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ import * as _ from 'radashi'
_.isNumber('hello') // => false
_.isNumber(['hello']) // => false
_.isNumber(12) // => true
_.isNumber(NaN) // => true
```
2 changes: 1 addition & 1 deletion src/typed/isFloat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ import { isNumber } from 'radashi'
* @version 12.1.0
*/
export function isFloat(value: any): value is number {
return isNumber(value) && value % 1 !== 0
return isNumber(value) && !Number.isNaN(value) && value % 1 !== 0
}
4 changes: 2 additions & 2 deletions src/typed/isNumber.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
* ```ts
* isNumber(0) // => true
* isNumber('0') // => false
* isNumber(NaN) // => false
* isNumber(NaN) // => true
* ```
* @version 12.1.0
*/
export function isNumber(value: unknown): value is number {
return typeof value === 'number' && !Number.isNaN(value)
return typeof value === 'number'
}
4 changes: 2 additions & 2 deletions tests/typed/isNumber.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ describe('isNumber', () => {
const result = _.isNumber(22.0567)
expect(result).toBeTruthy()
})
test('returns false for NaN', () => {
test('returns true for NaN', () => {
const result = _.isNumber(Number.NaN)
expect(result).toBeFalsy()
expect(result).toBeTruthy()
})
test('returns false for array', () => {
const result = _.isNumber([1, 2, 3])
Expand Down

0 comments on commit 586de44

Please sign in to comment.