类型检查和类型推断

  1. TypeScript的类型常常是给编译器检查用的,如

    const user: User = {
      name: "Tom",
      age: 20,
    }

    编译成JavaScript后只有

    const user = {
      name: "Tom",
      age: 20,
    }
  2. TypeScript大量使用类型推断

    const users = [
        { name: "Alice", age: 20 },
        { name: "Bob", age: 22 }
    ];

    则自动推断为

    {
        name: string;
        age: number;
    }[]

匿名函数

const add = (a: number, b: number) => a + b

类似C++中的lambda表达式。=>后可以是函数体,也可以直接写返回值。如

const add = (a: number, b: number): number => a + b

就相当于

const add = (a: number, b: number): number => {
  return a + b
} 

TypeScript中大量使用匿名函数,是因为JavaScript中函数相当于普通值,可以被赋给变量

const names = users.map(user => user.name);

注意

user => ({
    name: user.name,
    age: user.age
})

=>后({})表示返回一个对象,而非函数体

null和undefined,unknown和any

  1. null明确表示空值,而undefined表示不存在,或未提供的值。也就是说,null是程序员自己定义的,而undefined是对访问越界或未定义的值时的安全措施,如

    const user: User | null = getUser();
    console.log(user?.name);

    若user的类型是null,则user.name的类型是undefined。

  2. unknown和any都表示一个不确定的类型,区别在于any完全绕过类型检查,unknown在使用前则必须进行类型检查,即类型安全的any

    let value: unknown = "hello";
    // 必须进行类型收窄才能使用
    if (typeof value === "string") {
      console.log(value.toUpperCase());
    }

注意null和undefined是值,而unknown和any是类型

|、??、?.

|表示联合类型,如

let id: string | number;
id = 123;
id = "abc";

id既可以是string,也可以是number。

const name = user.name ?? "Unknown";

表示如果 user.name 是 null 或 undefined,就使用 "Unknown"。

const user: User | null = getUser();
console.log(user?.name);

表示如果user = null,则user?.name得到undefined。

Promise,async和await

  1. Promise表示一个异步操作的返回结果,在未来某个时刻才会得到确切结果。一个 Promise 必然处于以下几种状态之一:

    • 待定(pending):初始状态,既没有被兑现,也没有被拒绝。
    • 已兑现(fulfilled):意味着操作成功完成。
    • 已拒绝(rejected):意味着操作失败。

    Promise有构造函数:

    new Promise(executor)

    函数executor接受两个函数作为参数:resolveFunc和rejectFunc。当 resolveFunc 或者 rejectFunc 被调用时,该 Promise 对象就会变为已解决(resolved)。

    const p = new Promise((resolve, reject) => {
      setTimeout(() => {
        Math.random() > 0.5 ? resolve('成功的数据') : reject(new Error('失败了'));
      }, 1000);
    });

    Promise不会阻塞主线程。

  2. async和await是用同步方式写Promise链的语法糖。

    async用来声明一个异步函数。

    async function foo() {
      return 1;
    }
    // 等价于
    function foo() {
      return Promise.resolve(1);
    }

    async函数永远返回Promise。返回普通值会被自动Promise.resolve包装,抛出的异常会变成rejected。

    await用来等待一个Promise完成,出现在async函数内部,暂停当前async函数执行,直到Promise对象settle,但是不阻塞主线程。

    async function test() {
        const result = await fetch("/api/user");
        console.log(result);
    }