TypeScript null/undefined
null 表示「有意的空值」,undefined 表示「尚未赋值/未定义」。TypeScript 中它们是两个独立的类型,处理可空数据时稍不留神就会引发运行时错误,因此需要认真对待。
null 与 undefined 的区别
| 值 | 含义 | 典型场景 |
|---|---|---|
| null | 明确表示「空」 | 接口返回空数据、手动置空 |
| undefined | 声明了但没有赋值 | 未初始化的变量、访问不存在的属性 |
let a: null = null; // 只能赋 null
let b: undefined = undefined; // 只能赋 undefined
console.log(a, b); // 输出:null undefined
console.log(typeof a, typeof b); // 输出:object undefined
strictNullChecks 的影响
开启 strictNullChecks(strict 模式默认开启)后,null/undefined 不能赋给其他类型,能在编译期拦截大量空值错误:
// tsconfig.json 中 "strict": true 即包含该项
let city: string = null; // 报错:null 不能赋给 string
let maybe: string | null = null; // 正确:使用联合类型
console.log(maybe);
用联合类型表达「可能为空」
可空数据应显式写成 string | null 等形式,使用前先做判断:
function findName(id: number): string | null {
return id === 1 ? "张三" : null;
}
let name = findName(2);
if (name !== null) {
console.log(name.toUpperCase());
} else {
console.log("未找到"); // 输出:未找到
}
可选参数与可选属性
参数和属性加 ? 表示可以省略,其类型会自动包含 undefined:
function greet(name?: string) {
console.log("你好," + (name ?? "朋友"));
}
greet(); // 输出:你好,朋友
greet("小红"); // 输出:你好,小红
interface User {
name: string;
age?: number; // 等价于 age: number | undefined
}
let u: User = { name: "张三" };
console.log(u.age); // 输出:undefined
空值合并运算符 ??
?? 只在左侧为 null 或 undefined 时取右侧默认值,与 || 不同:0、"" 等假值不会被替换:
let a: number | null = null;
console.log(a ?? 10); // 输出:10
console.log(0 ?? 10); // 输出:0
console.log(0 || 10); // 输出:10(0 被视为假值)
小结
null/undefined 是空值处理的基础:优先用联合类型显式表达可空性,访问前做空值判断,配合 ?? 空值合并,可以大幅减少运行时「读不到属性」类的崩溃。