TypeScript中通过外部函数调用Type Guard为何无法窄化类型?
TypeScript类型未窄化的原因解析
TypeScript无法在调用isNotNull后自动将value类型窄化为number,核心原因如下:
普通函数无类型守卫关联:你写的
isNotNull只是普通函数,TypeScript的类型分析器默认不会把函数的返回值和传入参数的类型做绑定推导。它没法确认函数内部的逻辑是否严格完成了“非null”校验,自然不会基于函数返回结果修改参数的类型。缺少类型谓词注解:要让函数具备类型窄化的能力,必须给它加上类型谓词的注解,明确告知TypeScript:当函数返回
true时,传入的参数一定不属于null类型。
举个对比示例:
无效写法(无法窄化)
function isNotNull(value: number | null) { return value !== null; } function feature(value: number | null) { if (isNotNull(value)) { // 这里value的类型还是number | null,TS不会窄化 console.log(value.toFixed(2)); // 会报错 } }
有效写法(实现类型窄化)
function isNotNull(value: number | null): value is number { return value !== null; } function feature(value: number | null) { if (isNotNull(value)) { // 这里value的类型被自动窄化为number console.log(value.toFixed(2)); // 正常通过校验 } }
内容的提问来源于stack exchange,提问作者Gianna
相关产品推荐
相关产品推荐

