记录 TypeScript 中的特殊符号

528 阅读3分钟

TypeScript 是一个强类型的 JavaScript 超集,提供了许多方便的操作符和语法糖,记录一下平时开发中遇到的特殊符号。

开头

  • ?:可选属性/参数
  • ??:空值合并操作符
  • ?.:可选链操作符
  • ?::三元运算符
  • !:非空断言操作符
  • !!:将值转换为布尔值
  • ||:逻辑或操作符
  • |:联合类型,表示一个值可以是多种类型之一
  • &:交叉类型,表示一个值必须同时满足多种类型的要求

?(可选属性和可选参数)

  1. 可选属性: 用于定义接口或类型中的可选属性。如果某个属性可能不存在,可以使用?来标记它。

    interface User {
      name: string;
      age?: number; // age是可选属性
    }
    
    const user1: User = { name: "张三" };
    const user2: User = { name: "张四", age: 25 };
    
  2. 可选参数: 用于函数参数,表示该参数是可选的。

    function greet(name: string, age?: number) {
      if (age) {
        console.log(`你好, ${name}. 你今年 ${age} 了.`);
      } else {
        console.log(`你好, ${name}.`);
      }
    }
    
    greet("张三");
    greet("张四", 25);
    

??(空值合并操作符)

用于当左侧操作数为nullundefined时,返回右侧操作数。否则,返回左侧操作数。

let name: string | null = null;
let defaultName = "游客";
let displayName = name ?? defaultName; // displayName的值为"游客"

?.(可选链操作符)

用于在访问对象属性时,如果对象为nullundefined,不会导致错误,而是返回undefined

let user: { name?: string } = {};
console.log(user.name?.toUpperCase()); // 如果name不存在,不会抛出错误,而是返回undefined

?:(三元运算符)

条件运算符,用于根据条件表达式返回两个值之一。

let age = 18;
let message = age >= 18 ? "成年人" : "未成年人"; // 如果age大于或等于18,message为"成年人",否则为"未成年人"

!(非空断言操作符)

用于断言某个值不是nullundefined。即使类型系统认为该值可能为空,这个操作符告诉编译器你确定这个值是非空的。

let name: string | null = "张三";
console.log(name!.length); // 确定name不是null

!!(双重否定)

用于将任意值转换为布尔值。第一个!将值转换为其相反的布尔值,第二个!再将其转换回来。

let value = "Hello";
let isValuePresent = !!value; // isValuePresent的值为true

||(逻辑或操作符)

用于返回第一个为真的操作数。如果左侧操作数为假值(例如false0""nullundefined),则返回右侧操作数。否则,返回左侧操作数。

let name = "";
let defaultName = "游客";
let displayName = name || defaultName; // displayName的值为"游客"

|(联合类型)

允许变量是多个类型中的任何一个,可以用来表示变量具有多种可能的类型。

let value: string | number;

value = "Hello"; // 合法
value = 42;      // 合法
value = true;    // 不合法,编译错误

&(交叉类型)

需要变量同时满足所有类型的要求,可以用来表示组合类型的所有属性和方法。

interface Person {
    name: string;
}

interface Employee {
    employeeId: number;
}

let employee: Person & Employee;

employee = {
    name: "张三",
    employeeId: 1234
}; // 合法

employee = {
    name: "张三"
}; // 不合法,编译错误

employee = {
    employeeId: 5678
}; // 不合法,编译错误