如何要求函数参数必须为联合类型而非单一成员类型?
解决方法:限制函数仅接受可能为null的联合类型参数
要实现只允许传入可能为null的值,同时拒绝确定非null的类型,我们可以利用TypeScript的泛型和条件类型来约束参数类型:
// 定义泛型函数,通过条件类型过滤确定非null的类型 const isNull = <T extends string | null>(value: T extends string ? never : T): value is null => { return value === null; };
原理说明
- 泛型
T被约束为string | null,确保参数只能是这两种类型的组合 - 条件类型
T extends string ? never : T的作用:- 如果
T是确定的string类型(没有null的可能),则参数类型变为never,直接触发类型错误 - 如果
T是string | null的联合类型(存在为null的可能),则参数类型保留为T,允许正常传入
- 如果
测试验证
符合预期的用法(允许通过):
const maybeNull = Math.random() < 0.5 ? 'value' : null; isNull(maybeNull); // 正常编译,无错误
需要禁止的用法(触发错误):
const definitelyNotNull = 'value'; isNull(definitelyNotNull); // 类型错误:'string'不能赋值给'never'类型
另一种实现方式
也可以用自定义类型工具来封装判断逻辑,让代码更清晰:
// 自定义类型:仅允许包含null的类型,否则返回never type MaybeNull<T> = null extends T ? T : never; const isNull = <T>(value: MaybeNull<T>): value is null => { return value === null; };
这个版本的逻辑和上面一致,只是把条件判断抽成了独立的类型工具,效果完全相同。
内容的提问来源于stack exchange,提问作者J Garcia
相关产品推荐
相关产品推荐

