如何优化TypeScript非空校验工具函数实现正确类型收窄
可行解决方案
核心方案是将工具函数改写为带类型谓词的泛型类型守卫函数,让TypeScript可以识别函数返回值和入参类型的关联,自动完成非空收窄,完全不需要使用非空断言操作符。
改造后的函数代码如下:
function validateInputs<T extends unknown[]>( ...args: T ): args is { [K in keyof T]: Exclude<T[K], null | undefined> } { return args.every(arg => arg !== null && arg !== undefined); }
实现逻辑说明
- 泛型参数
T会自动捕获传入参数的元组类型,比如传入两个类型为string | undefined的参数时,T会被推导为[string | undefined, string | undefined] - 返回值位置的
args is ...是TypeScript的类型谓词语法,作用是告诉编译器:当函数返回true时,传入的args符合后面给出的类型规则 - 映射类型
{ [K in keyof T]: Exclude<T[K], null | undefined> }会遍历元组的每一个位置,把对应位置类型里的null和undefined完全剔除 - 这个写法支持任意数量的入参,不需要根据参数个数写多个类型重载,扩展性很好
使用效果
改造后再做校验,TypeScript会自动完成类型收窄:
const email: string | undefined = "demo@mail.com"; const nickname: string | undefined = "demo_user"; if (validateInputs(email, nickname)) { // 此分支内email、nickname会被自动推导为string类型,直接调用字符串方法不会报类型错误 email.split("@"); nickname.trim(); }
如果传入的参数包含其他联合类型(比如number | null、boolean | undefined),收窄逻辑也会正常生效,不会错误覆盖原有类型。
内容的提问来源于stack exchange,提问作者tmanuel
相关产品推荐
相关产品推荐

