NonNullable<T>

最后更新:2026-10-22

NonNullable<T> NonNullable

NonNullable<T> 从类型 T 中剔除 null 和 undefined。适合"字段声明上允许空、但走到这里时业务已保证非空"的场合——比如默认值兜底、数组过滤之后。它本质是 Exclude<T, null | undefined> 的专用别名。

分组工具类型
类型类型
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

type NonNullable<T> = T extends null | undefined ? never : T;

// 用法
type Name = NonNullable<string | null | undefined>;  // string

function pickFirst(values: Array<string | null | undefined>): string {
  for (const v of values) {
    if (v != null) {
      const clean: NonNullable<typeof v> = v;
      return clean;
    }
  }
  return "(none)";
}

⚙️ 参数

T源类型,通常含 null/undefined 成员;联合类型时逐成员剔除空值

返回值:一个新类型:T 中不含 null 与 undefined 的部分。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

Ada
(none)

(转译后运行输出;类型层面:CleanField 是 string | number——null/undefined 已被 NonNullable 剔除,把 v != null 过滤后的值赋给它才能通过检查)

💡 要点

ℹ️ 说明 实现:type NonNullable<T> = T extends null | undefined ? never : T——与 Exclude 同款的条件类型分配写法。
💡 提示 它只改类型不改值:运行时"去空"要靠 v != null 过滤、?? 默认值或 Array.filter。类型与运行时清理配合使用才完整。
⚠️ 注意 不要用 NonNullable 硬"洗白"你没把握的空值:把 string | null 标成 string,编译不报错、运行时照样 null.dosomething 崩溃。空值应先用运行时检查处理掉。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q NonNullable 和非空断言 ! 有什么区别?
A 效果上都是"去掉 null/undefined",但 NonNullable 是类型运算(生成新类型,可复用、可组合),! 是表达式级断言(就地生效、不可复用)。需要把"去空后的类型"当独立类型用时,用 NonNullable。
Q NonNullable 会影响 boolean 吗?
A 不会剔除 false——它只针对 null 和 undefined 这两个字面量。boolean | null 经 NonNullable 得到 boolean(含 true 和 false)。
Q 关闭 strictNullChecks 后 NonNullable 还有意义吗?
A 非严格模式下 null/undefined 本就可赋给一切类型,NonNullable 的收窄效果不再可感知。它配合 strictNullChecks 才有意义,这也是推荐始终开严格模式的又一个理由。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏