TypeScript 中的高级类型:一份完整的入门指南

TypeScript 是一种静态类型的编程语言,它是 JavaScript 的超集,为 JavaScript 带来了许多强类型支持、面向对象编程的特性。随着 TypeScript 不断推广和普及,越来越多的开发者开始接触 TypeScript。在使用 TypeScript 进行编程时,理解 TypeScript 中的高级类型是很重要的。本文将为您介绍 TypeScript 中的高级类型,自 TypeScript 2.0 中引入了高级类型以来,需要通过高级类型才能实现的功能越来越多,更好地了解高级类型将帮助您编写更优秀的 TypeScript 代码。

基本类型

TypeScript 支持基本类型,如:

  • string:字符串类型。
  • number:数字类型,包括整型和浮点型。
  • boolean:布尔类型,代表真值和假值。
  • void:表示没有任何返回值的函数。
  • nullundefined: null 和 undefined 类型。

这些基本类型的使用与 JavaScript 中的相同。

自定义类型

TypeScript 中还允许我们定义自己的类型。我们可以使用 interface 定义一个接口,定义一个变量符合这个接口的结构。如下例:

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

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

在上面的例子中,我们定义了一个接口 User,包含了 name 和 age 两个属性,接着我们定义了一个 user 变量,这个变量符合 User 接口的结构,即包含了 name 和 age 属性。

高级类型

接下来我们来看一些 TypeScript 中的高级类型。

联合类型

TypeScript 中的 联合类型 (Union Types)允许指定一个变量的类型可以为多种类型中的任意一种。在类型上使用 |(竖线)符号来表示。例如:

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

在上述例子中,id 可以是 number 类型或者 string 类型。

交叉类型

TypeScript 中的 交叉类型 (Intersection Types)表示多种类型的组合。使用 & 符号来表示。例如:

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

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

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

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

上面的例子中,我们定义了两个接口 HasName 和 HasAge,它们分别包含了 name 和 age 属性,然后使用交叉类型 type Person = HasName & HasAge 来表示一个既包含了 name 属性又包含了 age 属性的对象。最后,我们定义了一个 person 变量,它符合 Person 的结构。

类型保护

TypeScript 中的 类型保护 (Type Guards)可以用于判断变量的类型是否符合一个类型,这样就可以安全地使用相应类型的属性和方法。

常见的类型保护有:

  • typeof:判断是不是某种类型,如 typeof a === 'number' 来判断变量 a 是否为数字类型。
  • instanceof:判断是否属于某个类,如 someVar instanceof SomeClass 来判断 someVar 是否为 SomeClass 类型。
  • in:判断对象是否存在某个属性/方法,如 'name' in person 判断 person 对象中是否存在 name 属性。

泛型

TypeScript 中的 泛型 (Generics)可以让我们定义一个可以适用于多种数据类型的函数或类,并且支持传递类型参数。

例如,下面的 identity 函数可以返回传入的参数:

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

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

identity 函数中,我们使用了一个类型变量 T,它表示传入的参数的类型。当我们传递一个数组到该函数时,T 会被自动推导为该数组的元素的类型。

映射类型

TypeScript 中的 映射类型 (Mapped Types)是一种类型变换,可以在元素类型上按照指定的方式进行转换。

例如,下面的示例代码定义了一个类型 PartialUser,它将 User 中的所有属性都变成可选的:

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

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

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

在上述代码中,我们定义了一个类型 PartialUser,其中包含了一个类型变量 K,它表示 User 中所有属性的名字。通过 in 关键字,我们遍历了 User 中的所有属性名,然后将每个属性都变成了可选的,最后,我们定义了一个变量 user,这个变量只包含了 name 属性。由于 agesex 属性是可选的,所以我们可以不用传递它们。

索引类型

TypeScript 中的 索引类型 (Index Types)用于描述可以通过索引得到的类型的结构。

例如,下面的示例代码定义了一个类型 Person,它包含了 firstNamelastName 属性:

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

我们可以通过索引访问 Person 中的属性,如:

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

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

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

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

在上面的示例代码中,我们定义了一个类型 PersonKey,它可以取到 PersonfirstNamelastName 的名称。使用键类型 PersonKey 作为键名,我们定义了一个函数 getPersonProperty,它可以获取 Person 对象中给定键名的属性值。最后,我们定义了一个 person 对象,传递给 getPersonProperty 函数,获取到了 firstName 属性的值。

结论

TypeScript 中的高级类型为我们提供了强类型化的支持,使我们可以更好地避免类型相关的错误,提高了代码的可读性和可维护性。本文详细讲解了 TypeScript 中的高级类型,包括联合类型、交叉类型、类型保护、泛型、映射类型以及索引类型。相信通过学习本文,您已经掌握了 TypeScript 中的高级类型,从而可以编写更加健壮、可靠的 TypeScript 代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670ebf7b5f5512810261f70b