为何Number.isInteger无法将类型收窄为仅number类型?
Number.isInteger 无法实现TypeScript类型收窄?
Number.isInteger() 无法进行类型收窄(narrow),示例代码如下:
function checkNum(num: number | undefined ) { if (Number.isInteger(num)){ console.log(typeof num) //^? number | undefined } else { console.log(typeof num) //^? number | undefined } }
除了手动断言外,有没有其他方法能把类型收窄为仅number?我想把它和Math.floor()配合使用。
解决方案1:自定义类型守卫函数
自己实现一个类型守卫,让TypeScript能识别判断逻辑,从而正确收窄类型:
function isInteger(num: number | undefined): num is number { return typeof num === 'number' && Number.isInteger(num); } function checkNum(num: number | undefined ) { if (isInteger(num)){ console.log(typeof num); // 此时num类型确定为number console.log(Math.floor(num)); // 可安全调用Math.floor } else { console.log(typeof num); // num类型为undefined } }
解决方案2:先判断类型再校验整数
先通过typeof num === 'number'排除undefined,再用Number.isInteger判断是否为整数:
function checkNum(num: number | undefined ) { if (typeof num === 'number' && Number.isInteger(num)){ console.log(typeof num); // number console.log(Math.floor(num)); // 正常调用无类型报错 } else { console.log(typeof num); // undefined 或非整数的number } }
原因说明
TypeScript内置的Number.isInteger类型定义中,参数是unknown类型,它不会自动帮你排除undefined这类非number值,所以需要额外的类型判断逻辑来让TypeScript正确识别变量的类型范围。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

