TypeScript 中的型别交集 (Intersection Types) 详解

阅读时长 7 分钟读完

在 TypeScript 中,型别交集 (Intersection Types) 是一种非常有用的类型组合方式。它可以将多个类型组合成一个新的类型,新类型包含了所有原类型的属性和方法。本文将详细介绍 TypeScript 中的型别交集,包括语法、用法、示例以及注意事项。

语法

在 TypeScript 中,使用 & 符号表示型别交集。例如,下面的代码定义了一个 Person 类型和一个 Worker 类型,然后将它们组合成一个新的 Employee 类型:

-- -------------------- ---- -------
--------- ------ -
  ----- -------
  ---- -------
-

--------- ------ -
  -------- -------
  ------- -------
-

---- -------- - ------ - -------

在上面的代码中,Employee 类型包含了 PersonWorker 类型的所有属性和方法,即 nameagecompanysalary

用法

型别交集的主要用途是将多个类型合并成一个新的类型。这样做的好处是可以避免重复定义类型,提高代码的可维护性和可读性。例如,假设我们有一个 User 类型和一个 Admin 类型,它们都有一个 name 属性和一个 id 属性。我们可以使用型别交集将它们组合成一个新的 UserOrAdmin 类型,如下所示:

-- -------------------- ---- -------
--------- ---- -
  ----- -------
  --- -------
-

--------- ----- -
  ----- -------
  --- -------
  ----- -------
-

---- ----------- - ---- - ------

在上面的代码中,UserOrAdmin 类型包含了 UserAdmin 类型的所有属性和方法,即 nameidrole。这样一来,我们就可以使用 UserOrAdmin 类型来表示既是用户又是管理员的对象。

另外,型别交集还可以用于类型推断。例如,假设我们有一个 filter 函数,它接受一个数组和一个函数作为参数,然后返回符合条件的数组元素。我们可以使用型别交集来定义函数参数的类型,如下所示:

-- -------------------- ---- -------
-------- -------------- ---- --------- ------- -- -- --------- --- -
  -- ---
-

--------- ------ -
  ----- -------
  ---- -------
-

--------- ------ -
  -------- -------
  ------- -------
-

---- -------- - ------ - -------

----- ---------- ---------- - -
  - ----- -------- ---- --- -------- --------- ------- ----- --
  - ----- ------ ---- --- -------- ----------- ------- ----- --
  - ----- ---------- ---- --- -------- --------- ------- ----- --
--

----- ------ - ----------------- ---------- -- ------------ - -- -- --------------- - -------

在上面的代码中,filter 函数的第一个参数是一个 Employee 类型的数组,第二个参数是一个函数,它接受一个 Employee 类型的参数并返回一个布尔值。我们可以使用型别交集来定义函数参数的类型,这样 TypeScript 就可以推断出正确的类型,从而提供更好的代码提示和类型检查。

示例

下面是一个更复杂的示例,它演示了如何使用型别交集来定义一个包含多个接口的复杂类型:

-- -------------------- ---- -------
--------- ------ -
  ----- -------
  ---- -------
-

--------- ------ -
  -------- -------
  ------- -------
-

--------- ------- -
  ------- -------
  ------ -------
-

--------- ------- -
  ------- -------
  ----------- -------
-

---- -------- - ------ - -------
---- -------------- - ------ - --------
---- ----------------- - ------ - ------- - - ------ ------ --
---- ------------ - -------------- - ----------------- - --------

----- ---------- ---------- - -
  - ----- -------- ---- --- -------- --------- ------- ----- --
  - ----- ------ ---- --- -------- ----------- ------- ----- --
  - ----- ---------- ---- --- -------- --------- ------- ----- --
--

----- --------- -------------- - -
  - ----- -------- ---- --- ------- ------ ------ --------- -------- --
  - ----- -------- ---- --- ------- ---------- ------ ---------- --
  - ----- -------- ---- --- ------- ----------- ------ -------------- ------ - --
--

----- --------- -------------- - -
  - ----- --------- ---- --- ------- ------ ----------- --------- -------- --
  - ----- -------- ---- --- ------- ---------- ----------- ---------- --
  - ----- -------- ---- --- ------- ----------- ----------- ------------- --
--

在上面的代码中,我们定义了四个接口 PersonWorkerStudentTeacher,然后使用型别交集将它们组合成了三个新的类型 EmployeeCollegeStudentUniversityStudent。最后,我们将这些类型组合成了一个 SchoolMember 类型,它可以表示学校成员的所有可能类型。

注意事项

在使用型别交集时,需要注意以下几点:

  • 型别交集只能组合类型,不能组合值。例如,下面的代码是错误的:

    在上面的代码中,我们试图将 personworker 两个对象组合成一个新的对象 employee,但这样是不行的。因为 & 符号只能用于组合类型,不能用于组合值。

  • 型别交集的顺序是无关紧要的。例如,下面的两个类型是等价的:

    在上面的代码中,无论是先定义 Person 还是先定义 Worker,最终的 Employee 类型都是一样的。因为型别交集是满足交换律的。

  • 型别交集可以使用在任何地方需要类型的地方。例如,可以将它用作函数的返回类型、变量的类型、类型别名的类型等等。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d943f2a941bf71340d9923

纠错
反馈