返回

TypeScript 类型体操之 Pick:从类型中提取指定属性的艺术

前端

TypeScript 类型体操:Pick – 从类型中提取指定属性的利器

TypeScript 的强大之处在于它的类型系统,它让我们能够在编译时捕捉错误并确保代码的健壮性。而 TypeScript 类型体操则是利用 TypeScript 的类型系统来创建更灵活、更可重用的类型的艺术。在类型体操的宝库中,Pick 扮演着至关重要的角色,因为它让我们能够从一个类型中提取指定的属性,从而创建新的类型。

Pick 的语法

Pick 的语法很简单,它接收两个参数:

  • 要提取属性的类型 T :这是我们要提取属性的原始类型。
  • 要提取的属性名的联合类型 K :这是我们要从 T 中提取的属性名的集合。

Pick 返回一个新的类型,它包含了 T 中所有属性,除了那些未包含在 K 中的属性。

例如,我们有一个 User 类型,它包含以下属性:

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

如果我们想创建一个新的类型,只包含 User 类型中的 name 和 age 属性,我们可以使用 Pick 如下:

type UserWithoutGender = Pick<User, "name" | "age">;

现在,UserWithoutGender 类型包含以下属性:

interface UserWithoutGender {
  name: string;
  age: number;
}

使用 Pick 时,TypeScript 会自动检查要提取的属性名是否在原始类型中。如果属性名不在原始类型中,TypeScript 会提示错误。这大大提高了我们写代码时的容错性。

Pick 的使用场景

Pick 的使用场景非常广泛,以下是一些常见的例子:

  • 从一个类型中提取指定属性,以创建新的类型。
  • 从一个类型中提取指定属性,以创建接口或类。
  • 从一个类型中提取指定属性,以创建函数参数或返回值类型。
  • 从一个类型中提取指定属性,以创建泛型类型。

Pick 的进阶用法

除了基本用法之外,Pick 还有一些进阶用法,可以帮助我们创建更灵活、更可重用的类型。

使用索引类型提取属性

索引类型允许我们使用动态的键名来访问类型中的属性。这可以与 Pick 一起使用,以从类型中提取具有特定前缀或后缀的属性。

例如,我们有一个 Product 类型,它包含以下属性:

interface Product {
  id: number;
  name: string;
  price: number;
  quantity: number;
}

如果我们想创建一个新的类型,只包含 Product 类型中以 "price_" 开头的属性,我们可以使用 Pick 和索引类型如下:

type ProductWithPricePrefix = Pick<Product, `price_${string}`>;

现在,ProductWithPricePrefix 类型包含以下属性:

interface ProductWithPricePrefix {
  price_id: number;
  price_name: string;
  price_price: number;
  price_quantity: number;
}

使用交叉类型提取属性

交叉类型允许我们组合多个类型来创建一个新的类型。这可以与 Pick 一起使用,以从多个类型中提取属性。

例如,我们有一个 User 类型和一个 Address 类型,它们分别包含以下属性:

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

interface Address {
  street: string;
  city: string;
  state: string;
}

如果我们想创建一个新的类型,包含 User 类型和 Address 类型的属性,我们可以使用 Pick 和交叉类型如下:

type UserWithAddress = Pick<User, "name" | "age"> & Pick<Address, "street" | "city" | "state">;

现在,UserWithAddress 类型包含以下属性:

interface UserWithAddress {
  name: string;
  age: number;
  street: string;
  city: string;
  state: string;
}

结论

Pick 是 TypeScript 类型体操中一个非常有用的工具,它让我们能够从一个类型中提取指定的属性,从而创建新的类型。Pick 的用法非常灵活,可以满足各种各样的需求。如果您想深入学习 TypeScript 类型体操,那么 Pick 是您不可错过的一个工具。

常见问题解答

  1. Pick 和 Omit 的区别是什么?

    Pick 从一个类型中提取指定的属性,而 Omit 从一个类型中删除指定的属性。

  2. Pick 可以用来提取嵌套属性吗?

    是的,Pick 可以使用索引类型来提取嵌套属性。

  3. Pick 可以用来提取方法吗?

    不可以,Pick 不能用来提取方法。

  4. Pick 可以用来提取索引签名吗?

    不可以,Pick 不能用来提取索引签名。

  5. Pick 可以用来创建泛型类型吗?

    是的,Pick 可以用来创建泛型类型。