TypeScript 是一种静态类型的编程语言,它是 JavaScript 的超集,为 JavaScript 带来了许多强类型支持、面向对象编程的特性。随着 TypeScript 不断推广和普及,越来越多的开发者开始接触 TypeScript。在使用 TypeScript 进行编程时,理解 TypeScript 中的高级类型是很重要的。本文将为您介绍 TypeScript 中的高级类型,自 TypeScript 2.0 中引入了高级类型以来,需要通过高级类型才能实现的功能越来越多,更好地了解高级类型将帮助您编写更优秀的 TypeScript 代码。
基本类型
TypeScript 支持基本类型,如:
- string:字符串类型。
- number:数字类型,包括整型和浮点型。
- boolean:布尔类型,代表真值和假值。
- void:表示没有任何返回值的函数。
- null 和 undefined: null 和 undefined 类型。
这些基本类型的使用与 JavaScript 中的相同。
自定义类型
TypeScript 中还允许我们定义自己的类型。我们可以使用 interface 定义一个接口,定义一个变量符合这个接口的结构。如下例:
-- -------------------- ---- ------- --------- ---- - ----- ------ ---- ------ - ----- ----- ---- - - ----- ------- ---- -- -
在上面的例子中,我们定义了一个接口 User,包含了 name 和 age 两个属性,接着我们定义了一个 user 变量,这个变量符合 User 接口的结构,即包含了 name 和 age 属性。
高级类型
接下来我们来看一些 TypeScript 中的高级类型。
联合类型
TypeScript 中的 联合类型 (Union Types)允许指定一个变量的类型可以为多种类型中的任意一种。在类型上使用 |
(竖线)符号来表示。例如:
function printId(id: number | string) { console.log(`The ID is ${id}`) }
在上述例子中,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
函数可以返回传入的参数:
function identity<T>(arg: T): T { return arg } let output = identity<string>("myString")
在 identity
函数中,我们使用了一个类型变量 T
,它表示传入的参数的类型。当我们传递一个数组到该函数时,T
会被自动推导为该数组的元素的类型。
映射类型
TypeScript 中的 映射类型 (Mapped Types)是一种类型变换,可以在元素类型上按照指定的方式进行转换。
例如,下面的示例代码定义了一个类型 PartialUser
,它将 User
中的所有属性都变成可选的:
-- -------------------- ---- ------- --------- ---- - ----- ------ ---- ------ ---- ------ - ---- ----------- - - -- -- ----- ------- ------- - ----- ----- ----------- - - ----- ----- -
在上述代码中,我们定义了一个类型 PartialUser
,其中包含了一个类型变量 K
,它表示 User
中所有属性的名字。通过 in
关键字,我们遍历了 User
中的所有属性名,然后将每个属性都变成了可选的,最后,我们定义了一个变量 user
,这个变量只包含了 name
属性。由于 age
和 sex
属性是可选的,所以我们可以不用传递它们。
索引类型
TypeScript 中的 索引类型 (Index Types)用于描述可以通过索引得到的类型的结构。
例如,下面的示例代码定义了一个类型 Person
,它包含了 firstName
和 lastName
属性:
interface Person { firstName: string lastName: string }
我们可以通过索引访问 Person
中的属性,如:
-- -------------------- ---- ------- ---- --------- - ----- ------ -- ----------- - ---------- -------- ------------------------- ------- ---- ---------- - ------ ----------- - ----- ------- ------ - - ---------- -------- --------- ------- - ----- --------- - ------------------------- ------------
在上面的示例代码中,我们定义了一个类型 PersonKey
,它可以取到 Person
中 firstName
和 lastName
的名称。使用键类型 PersonKey
作为键名,我们定义了一个函数 getPersonProperty
,它可以获取 Person
对象中给定键名的属性值。最后,我们定义了一个 person
对象,传递给 getPersonProperty
函数,获取到了 firstName
属性的值。
结论
TypeScript 中的高级类型为我们提供了强类型化的支持,使我们可以更好地避免类型相关的错误,提高了代码的可读性和可维护性。本文详细讲解了 TypeScript 中的高级类型,包括联合类型、交叉类型、类型保护、泛型、映射类型以及索引类型。相信通过学习本文,您已经掌握了 TypeScript 中的高级类型,从而可以编写更加健壮、可靠的 TypeScript 代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670ebf7b5f5512810261f70b