返回

TypeScript 内置工具类型全解析:先收藏吃灰

前端

在 TypeScript 中,内置了丰富的工具类型,可以帮助我们更好地理解代码,避免类型错误。这些工具类型包括 Awaited、Awaitable、ReturnType、Parameter、Omit、Pick、Required、Readonly 和 Exclude 等。本文将详细解析这些工具类型的用法和意义,帮助你更好地掌握 TypeScript。一起阅读这篇文章,让我们快速成为 TypeScript 大师吧!

Awaited 和 Awaitable

Awaited 类型用于表示异步函数的返回值类型。它会递归推导出 async/await 方法返回的类型,或 Promise 兑现后(fulfilled)返回的类型。例如:

async function fetchUserData(): Promise<User> {
  // ...
}

type UserData = Awaited<ReturnType<typeof fetchUserData>>;

在这种情况下,UserData 的类型将是 User。

Awaitable 类型表示可以用于 await 的值,换句话说,就是可以被 await 操作符修饰的类型。例如:

async function main() {
  const data = await fetchUserData();
}

在上面的代码中,fetchUserData() 返回一个 Promise,因此它是一个 Awaitable 类型的值。

ReturnType 和 Parameter

ReturnType 类型用于获取函数的返回值类型。例如:

function add(a: number, b: number): number {
  return a + b;
}

type ResultType = ReturnType<typeof add>;

在这种情况下,ResultType 的类型将是 number。

Parameter 类型用于获取函数的参数类型。例如:

function multiply(a: number, b: number): number {
  return a * b;
}

type ParamsType = Parameter<typeof multiply>;

在这种情况下,ParamsType 的类型将是 [number, number]。

Omit、Pick、Required 和 Readonly

Omit 类型用于从一个类型中删除指定的属性。例如:

interface User {
  name: string;
  age: number;
  email: string;
}

type UserWithoutAge = Omit<User, "age">;

在这种情况下,UserWithoutAge 的类型将是 { name: string; email: string; }。

Pick 类型用于从一个类型中选择指定的属性。例如:

interface User {
  name: string;
  age: number;
  email: string;
}

type PickedUser = Pick<User, "name" | "email">;

在这种情况下,PickedUser 的类型将是 { name: string; email: string; }。

Required 类型用于将一个类型的可选属性变成必填属性。例如:

interface User {
  name?: string;
  age?: number;
  email?: string;
}

type RequiredUser = Required<User>;

在这种情况下,RequiredUser 的类型将是 { name: string; age: number; email: string; }。

Readonly 类型用于将一个类型的属性变成只读属性。例如:

interface User {
  name: string;
  age: number;
  email: string;
}

type ReadonlyUser = Readonly<User>;

在这种情况下,ReadonlyUser 的类型将是 { readonly name: string; readonly age: number; readonly email: string; }。

Exclude

Exclude 类型用于从一个类型中排除另一个类型。例如:

type User = {
  name: string;
  age: number;
  email: string;
};

type NotUser = Exclude<string | number | boolean | User, User>;

在这种情况下,NotUser 的类型将是 string | number | boolean。

结论

TypeScript 中的工具类型非常丰富,可以帮助我们更好地理解代码,避免类型错误。希望本文对您有所帮助。如果您有任何问题,请随时提问。