如何校验unknown类型值是否为有效数字?修复现有校验函数问题
问题:数值校验函数逻辑错误
给定一个unknown类型的值,以及一个指定该值必须为整数或浮点数的配置,编写了如下校验函数:
function isValueNumber(value: unknown, isAcceptingFloatingPointNumbers: boolean) { if (Number.isNaN(value)) { return false; } if (!isAcceptingFloatingPointNumbers) { return Number.isInteger(value); } return true; }
调用isValueNumber("this is not a valid number", true)时,函数返回true,不符合预期。原因是Number.isNaN仅会对NaN值返回true,非数值类型的参数(比如字符串)会直接返回false,导致后续逻辑错误放行非数值类型。
修复方案
要正确校验数值类型,需要先判断值的类型是否为number,再排除NaN和Infinity这类无效数值,最后根据配置判断是否接受浮点数:
function isValueNumber(value: unknown, isAcceptingFloatingPointNumbers: boolean) { // 首先判断是否为number类型,排除非数值类型 if (typeof value !== 'number') { return false; } // 排除NaN和正负Infinity if (Number.isNaN(value) || !Number.isFinite(value)) { return false; } // 不接受浮点数时,校验是否为整数 if (!isAcceptingFloatingPointNumbers) { return Number.isInteger(value); } // 接受浮点数时,直接返回true(已经通过前面的有效数值校验) return true; }
关键修复点:
- 增加
typeof value !== 'number'判断,直接排除所有非数值类型的输入; - 加入
Number.isFinite校验,排除Infinity和-Infinity这类无意义的数值; - 确保只有合法的数值类型才会进入后续的整数/浮点数判断逻辑。
内容的提问来源于stack exchange,提问作者baitendbidz
相关产品推荐
相关产品推荐

