如何约束泛型函数参数仅接受包含null或undefined的类型
实现仅接受包含null/undefined类型参数的泛型函数
你可以通过泛型约束结合条件类型实现这个需求,核心逻辑是判断泛型参数T是否包含null或undefined,不满足则触发编译错误:
// 定义约束类型:检查T是否包含null或undefined type MustIncludeNullish<T> = null extends T ? unknown : undefined extends T ? unknown : never; // 应用约束的泛型函数 function foo<T extends MustIncludeNullish<T>>(val: T) { // 函数逻辑写在这里 }
实现原理
MustIncludeNullish<T>会对泛型参数T做三层判断:- 如果
null是T的子类型(即T包含null),返回unknown(所有类型都能兼容unknown,约束生效); - 如果
undefined是T的子类型(即T包含undefined),同样返回unknown; - 若两者都不满足(
T是纯非空非undefined类型),返回never(普通类型无法兼容never,直接触发编译错误)。
- 如果
测试案例
// ❌ 编译报错:类型'string'不满足约束'never' const pureString = "hello"; foo(pureString); // ✅ 编译正常:string | null 包含null const strOrNull: string | null = "test"; foo(strOrNull); foo(null); // ✅ 编译正常:string | undefined 包含undefined const strOrUndefined: string | undefined = "test"; foo(strOrUndefined); foo(undefined); // ✅ 编译正常:同时包含null和undefined const strOrNullish: string | null | undefined = "test"; foo(strOrNullish);
内容的提问来源于stack exchange,提问作者Sebastian Barth
相关产品推荐
相关产品推荐

