You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何要求函数参数必须为联合类型而非单一成员类型?

解决方法:限制函数仅接受可能为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:01:09