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

· 约 7 分钟读完

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

语法

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

在上面的代码中,Employee 类型包含了 Person 和 Worker 类型的所有属性和方法,即 name、age、company 和 salary。

用法

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

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

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

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

示例

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

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

注意事项

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

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

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

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

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

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

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