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 才有意义,这也是推荐始终开严格模式的又一个理由。