TypeScript严格空检查下如何同时校验多变量非undefined?
解决strictNullChecks下批量校验变量非undefined并保留类型的问题
我太懂你这种不想重复写if (a === undefined)的心情了!在strictNullChecks模式下,手动逐个校验确实麻烦,而且普通的校验函数很容易让TS丢失类型推断。下面给你两个能完美保留类型信息的方案:
方案一:使用断言函数(Assertion Function)
这种方案会直接修改TS对原变量的类型推断,校验通过后原变量就会被认定为非undefined类型:
// 定义一个通用的断言函数,支持任意数量的变量 function assertAllDefined<T extends unknown[]>(...args: T): asserts args is { [K in keyof T]: Exclude<T[K], undefined> } { // 遍历所有传入的变量,只要有一个是undefined就抛出错误 for (const arg of args) { if (arg === undefined) { throw new Error("Error: One or more variables are undefined!"); } } }
用法示例:
// 声明可能为undefined的变量 let a: number | undefined; let b: number | undefined; let c: number | undefined; let d: number | undefined; // 模拟变量赋值逻辑(比如从接口获取数据) a = 10; b = 20; c = 30; d = 40; // 批量校验 assertAllDefined(a, b, c, d); // 现在TS会完全认可这四个变量都是number类型,不会报错 const total = a + b + c + d; console.log(total); // 100
这个函数的核心是asserts args is ...语法,它告诉TS:如果函数执行完毕没有抛出错误,那么传入的所有参数都排除了undefined类型。
方案二:返回校验后的非undefined元组
如果你不想修改原变量的类型推断,而是希望得到一组全新的、类型安全的变量,可以用这个方案:
function ensureAllDefined<T extends unknown[]>(...args: T): { [K in keyof T]: Exclude<T[K], undefined> } { for (const arg of args) { if (arg === undefined) { throw new Error("Missing required value(s)!"); } } // 这里的类型断言是安全的,因为我们已经做了校验 return args as { [K in keyof T]: Exclude<T[K], undefined> }; }
用法示例:
let x: string | undefined = "Hello"; let y: number | undefined = 123; // 解构得到校验后的变量,它们的类型自动变成string和number const [validX, validY] = ensureAllDefined(x, y); // 放心使用,TS不会报类型错误 console.log(`${validX} ${validY}`); // "Hello 123"
额外提示
如果你的变量还可能为null,只需要稍微修改判断条件和类型:
- 判断条件改成
if (arg == null)(同时检查null和undefined) - 类型里改成
Exclude<T[K], null | undefined>
这样就能同时处理null和undefined的情况啦!
内容的提问来源于stack exchange,提问作者Letharion
相关产品推荐
相关产品推荐

