You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:42:37