3 ms·
The point of having a utility function is that you don't have to do the redundant checks every time you want to make sure it's both a number and an integer. Th
by explaininjs 4y ago
The point of having a utility function is that you don't have to do the redundant checks every time you want to make sure it's both a number and an integer.
The critical bit is that you need to define a new type for `integer`s distinct from `number`s to allow reusing the code in a way that doesn't break the type system on the negative path, as Ryan and I demonstrated.
- deleted 4y ago[deleted]
- benatkin 4y agoIt isn't redundant in terms of the amount of code written, to me. The overhead of having the utility function and type is greater IMO. If it's in terms of performance, that seems like moving the goalposts. I also wonder if it could be optimized away. Next time I run into it I might use this: if (Number.isInteger(s)) { const allowed = (s as number).toExponential() ...and keep the isInteger check close enough that it's readable. ...or this: if (Number.isInteger(s)) { const n = s as number // should be optimized away by the compiler I think
- explaininjs 4y agoYou asked for isInteger to work as a type guard and I showed you how. If you prefer explicit casts everywhere that's fine, but it isn't a type guard. You could even use the type anonymously if you really want: (n is number & {Symbol(): never}). Whatever floats your boat, as you say.
- benatkin 4y agoOh boy, I never ever asked for a replacement for Number.isInteger! I prefer to use native functions. Have a nice day.
- explaininjs 4y agoThen alter the type of the ambient native function itself: interface NumberConstructor { isInteger(n: unknown): n is number & { Symbol(): never } }