TypeScript 中的空值合并操作符

TypeScript 中的空值合并操作符

在本文中,我们将解释 TypeScript 中的空值合并操作符。

YouTube Video

TypeScript 中的空值合并操作符

TypeScript 中的空值合并操作符 (??) 类似于 JavaScript 的短路求值,但更明确地用作在左侧值为 nullundefined 时提供替代值。此操作符允许您轻松检查值是否为 nullundefined,并根据需要设置默认值。

空值合并操作符 (??) 仅在左侧值为 nullundefined 时返回右侧的值。这允许诸如 false、空字符串或数字 0 等值按其本身进行评估。这是与传统逻辑或操作符(||)的一大区别。此操作符是在 TypeScript 3.7 中引入的。

基本语法

基本语法如下:。

1let result = value ?? defaultValue;
  • value 是被检查是否为 nullundefined 的目标。
  • defaultValue 是当 valuenullundefined 时返回的值。

示例用法

1function getUserName(userName: string | null | undefined): string {
2    return userName ?? "Default User";
3}
4
5console.log(getUserName("Alice"));  // Output: Alice
6console.log(getUserName(null));     // Output: Default User
7console.log(getUserName(undefined)); // Output: Default User

在这里,如果 userNamenullundefined,函数 getUserName 返回 "Default User",否则返回 userName 的值。

与逻辑或操作符的区别

空值合并操作符与逻辑或操作符之间有一个重要区别。逻辑或操作符将像 false0""(空字符串)这样的值视为“假值”,就像 nullundefined 一样。另一方面,空值合并操作符仅使用 nullundefined 作为回退判定条件。

逻辑或操作符的示例

1function getUserAge(age: number | null | undefined): number {
2    return age || 18;  // `0` also applies the default value
3}
4
5console.log(getUserAge(25));  // Output: 25
6console.log(getUserAge(0));   // Output: 18
7console.log(getUserAge(null)); // Output: 18
  • 如图所示,即使值为 0,逻辑或操作符也会返回默认值 18

空值合并操作符的示例

1function getUserAge(age: number | null | undefined): number {
2    return age ?? 18;  // `0` does not apply the default value
3}
4
5console.log(getUserAge(25));  // Output: 25
6console.log(getUserAge(0));   // Output: 0
7console.log(getUserAge(null)); // Output: 18
  • 另一方面,空值合并操作符即使在值为 0 时也会返回原始值。

  • 逻辑或操作符与空值合并操作符的选择取决于是否可以接受 0 或空字符串。例如,如果您希望将用户的年龄保留为 0,则需要使用空值合并操作符。

与类型的结合

通过结合使用 TypeScript 的类型安全与空值合并操作符,可以增强代码的健壮性。在以下示例中,当某些属性为 nullundefined 时,将使用默认值。

 1interface User {
 2    name: string;
 3    age?: number | null;
 4}
 5
 6function displayUserInfo(user: User): string {
 7    const userName: string = user.name;
 8    const userAge: number = user.age ?? 18;
 9    return `Name: ${userName}, Age: ${userAge}`;
10}
11
12const user1: User = { name: "John", age: null };
13const user2: User = { name: "Doe" };
14
15console.log(displayUserInfo(user1)); // Output: Name: John, Age: 18
16console.log(displayUserInfo(user2)); // Output: Name: Doe, Age: 18
  • User 接口中,age 属性可以是 numbernullundefined,因此使用空值合并操作符赋予一个默认值 18
  • 同时,name 属性只允许 string 类型,因此直接使用该值。

总结

  • 空值合并操作符仅在值为 nullundefined 时帮助设置默认值。与传统的逻辑或操作符不同,它不会将 false0 或空字符串视为“假值”,因此在您想保留这些值时尤其有用。此外,将其与 TypeScript 的类型系统结合使用,可以创建更健壮且更易读的代码。
  • 通过有效地使用空合并操作符,可以简洁地编写设置默认值的逻辑,同时减少不必要的 null 检查。

TypeScript 中的空合并赋值操作符

空合并赋值操作符 (??=) 是 TypeScript 中引入的相对较新的操作符,它提供了一种方便的方法,仅在变量为 nullundefined 时分配值。在这里,我们将解释此操作符的工作原理、适用的场景,并提供代码示例。

什么是空合并赋值操作符

空值合并赋值操作符是一种基于空值合并操作符的赋值操作符。此操作符仅在变量为 nullundefined 时用于分配新值。

1let variable: string | null = null;
2variable ??= "Default Value"; // The variable is null,
3                              // so the new value is assigned
4
5console.log(variable); // Output: "Default Value"

使用此操作符,您可以更简洁地编写“如果变量未定义或为 null 则赋值”的逻辑。

与传统赋值方法的比较

如果没有空值合并赋值操作符,您将需要使用 if 语句或三元操作符来实现相同的行为。让我们与传统的赋值方法进行比较。

传统方法

使用 if 语句,可以写成如下:。

1let variable: string | null | undefined = null;
2if (variable === null || variable === undefined) {
3    variable = "Default Value";
4}
5console.log(variable); // Output: "Default Value"

使用三元运算符的方法

或者,使用三元操作符,可以写成如下:。

1let variable: string | null | undefined = undefined;
2variable = variable != null ? variable : "Default Value";
3// != null checks for both null and undefined
4// (intentional loose equality comparison)
5
6console.log(variable); // Output: "Default Value"

使用空值合并赋值操作符的简洁方法

另一方面,使用空值合并赋值操作符,可以写成如下:。

1let variable: string | null = null;
2variable ??= "Default Value";
3console.log(variable); // Output: "Default Value"

如图所示,空值合并赋值操作符比其他赋值方法更加简洁和可读,从而提高代码的清晰度。

??= 的具体用例

空值合并赋值操作符在多种场景中非常有用,例如初始化对象属性和设置默认值。以下是一些具体示例。

对象属性的初始化

 1interface Config {
 2    theme?: string;
 3    language?: string;
 4}
 5
 6let config: Config = {};
 7config.theme ??= "light";  // Set the default "light" theme if none is specified
 8config.language ??= "en";  // Set the default "en" language if none is specified
 9
10console.log(config); // Output: { theme: "light", language: "en" }

数组的初始化

1let numbers: number[] | null = null;
2numbers ??= [];  // Assign an empty array if numbers is null
3
4numbers.push(1);
5console.log(numbers); // Output: [1]

为函数参数设置默认值

1function greet(name?: string) {
2    name ??= "Guest";  // Set name to "Guest" if it is undefined or null
3    console.log(`Hello, ${name}!`);
4}
5
6greet();          // Output: "Hello, Guest!"
7greet("Alice");   // Output: "Hello, Alice!"

注意事项和限制

空值合并赋值操作符非常有用,但也有一些注意事项。

nullundefined 会成为目标。

1let str: string | null = "";
2str ??= "Default";
3console.log(str); // Output: "" (remains an empty string)
4
5let num: number | undefined = 0;
6num ??= 100;
7console.log(num); // Output: 0 (remains 0)
  • 此操作符仅在值为 nullundefined 时执行赋值。例如,空字符串("")、0false 等值不会成为目标。

与其他操作符一起使用时需小心。

 1let value: string | null = null;
 2
 3// Targets not only "null" and "undefined" but also falsy values
 4value ||= "Default";
 5console.log(value);  // Output: "Default"
 6
 7value = "";
 8// An empty string is also targeted
 9value ||= "Default";
10console.log(value);  // Output: "Default"
11
12value = null;
13// Targets only null or undefined
14value ??= "Default";
15console.log(value);  // Output: "Default"
  • 当与其他操作符一起使用时,空值合并赋值操作符可能会产生意外结果。特别重要的是要理解它与逻辑或赋值操作符之间的区别。

示例代码

 1let config: { theme?: string; language?: string } = {};
 2
 3// Use Nullish Coalescing Assignment to set default values
 4config.theme ??= "light";
 5config.language ??= "en";
 6
 7console.log(config); // Output: { theme: "light", language: "en" }
 8
 9let list: number[] | null = null;
10list ??= [];
11list.push(42);
12
13console.log(list); // Output: [42]
  • 通过使用空值合并赋值操作符,您可以消除不必要的代码,编写更简洁、更优雅的 TypeScript 代码。

总结

空值合并赋值运算符(??=)是 TypeScript 中一种简单高效的赋值操作。当需要检查 nullundefined 同时设置默认值时,这特别有用。与传统的 if 语句或三元操作符相比,代码变得更加简洁和可读。

您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。

YouTube Video