如何实现仅接受含undefined类型参数的isUndefined类型守卫函数
实现带参数类型限制的
isUndefined类型守卫函数 需要实现一个类型守卫函数isUndefined,满足以下核心要求:
- 仅接受**类型包含
undefined**的参数,不满足时触发编译错误 - 调用后能将参数的类型断言为
undefined
基础实现的不足
下面是一个基础的类型守卫实现,但它允许传入任意类型(因为参数为unknown),无法满足编译时的参数类型限制:
function isUndefined(value: unknown): value is undefined { return typeof value === 'undefined'; }
正确实现方案
通过泛型约束可以实现参数类型的编译时校验,同时保留类型断言能力:
function isUndefined<T>(value: T extends undefined ? T : T | undefined): value is Extract<T, undefined> { return typeof value === 'undefined'; }
或者更简洁的泛型约束写法,效果完全一致:
function isUndefined<T extends undefined | unknown>(value: T): value is Extract<T, undefined> { return typeof value === 'undefined'; }
验证期望行为
// ❌ 编译错误:参数类型boolean不包含undefined isUndefined(true) // ✅ 无编译错误:参数类型为boolean | undefined,包含undefined const arg = true as boolean | undefined isUndefined(arg) // 调用后,IDE中悬停arg会显示类型为undefined arg // arg: undefined
实现原理
- 泛型
T的约束确保传入的参数类型要么是undefined,要么是包含undefined的联合类型,不符合的参数会触发编译报错 Extract<T, undefined>工具类型从联合类型T中提取出undefined分支,实现精准的类型断言- 运行时逻辑保持简单可靠,通过
typeof操作符判断值是否为undefined
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

