Typescript 如何判断指定类型是否包含 undefined 类型
问题原因
你写的代码没有得到预期结果,是因为直接对具体联合类型使用extends时,不会触发分布式条件类型的分发逻辑,会把整个联合类型作为整体判断是否继承undefined,显然boolean | undefined整体不满足extends undefined的条件,所以得到的是no。
解决方案
你可以封装一个泛型工具类型实现需求,下面是两种常用的实现方式:
方式1:反向子类型判断(写法最简单)
直接判断undefined是否是目标类型的子类型,只要目标类型的联合分支里包含undefined,就会返回yes:
// 封装工具类型 type ContainsUndefined<T> = undefined extends T ? 'yes' : 'no'; // 测试 type a = boolean | undefined; type v = ContainsUndefined<a>; // 结果为 'yes' type b = string; type v2 = ContainsUndefined<b>; // 结果为 'no'
方式2:分布式条件类型实现
适合需要同时处理联合类型每个分支的扩展场景:
type IsUndefined<T> = T extends undefined ? true : never; type ContainsUndefined<T> = [IsUndefined<T>] extends [never] ? 'no' : 'yes'; // 测试 type a = boolean | undefined; type v = ContainsUndefined<a>; // 结果为 'yes'
注意事项
- 上述实现都是类型层面的静态判断,仅在编译阶段生效,不会生成任何运行时代码。如果需要在运行时判断变量值是否为
undefined,直接使用typeof 变量 === 'undefined'即可。 - 如果需要同时判断是否包含
null,把工具类型中的undefined替换为undefined | null即可。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

