Typescript 是一种建立在 Javascript 之上的强类型语言。因此,当我们编写代码时,必须在 Typescript 中定义类型,而不是像通常在 Javascript 中那样进行推断。
在本指南中,我们将深入探讨 Typescript 中的类型如何工作,以及如何充分利用它们。如果您对 Typescript 完全陌生,请从我们的制作您的第一个 Typescript 项目的指南开始。
Typescript 中的基本类型#
Javascript有许多不同的类型。如果您想了解类型在 Javascript 中的工作方式,请在此处阅读我们的指南。在本指南中,我们将介绍您可以在 Typescript 中使用的主要类型。了解 Javascript 类型会很有用,但为简单起见,下面列出了您最常看到的最基本的 Typescript 类型:
- undefined– 当代码中未定义或不存在某些内容时。
- any – 指任何类型 – 根本不强制执行类型。
- enum – 一个枚举 –有关枚举的更多信息,请参见此处。
- number – 介于 -2^53 – 1 和 2^53 – 1 之间的数字,即 1。
- string– 字符组合,即测试。
- boolean– 真或假。
- bigint – 一个大于 253 – 1 的数字。
- symbol– 一个完全唯一的标识符。
- function– 自我解释 – 一个功能。
- object – 一个对象或数组
- never – 在函数中使用 – 用于当函数从不返回值并且只抛出错误时。
- void – 在函数中使用 – 当函数从不返回值时。
Typescript 中的自定义类型
Typescript 还允许我们定义自己的自定义类型。你可以在这里了解。
Typescript 中的类型基础#
现在我们已经概述了 Typescript 使用的所有基本类型,让我们看看它们是如何工作的。首先,让我们从语法基础开始。
在变量中使用 Typescript 类型#
Typescript 中变量类型的语法相对简单。如果我们期望一个变量是一个特定的类型,我们在一个冒号之后,在变量名之后定义它。例如,以下变量被定义为具有 type number
。
let x:number = 5;
同样,字符串类型可能如下所示:
let x:string = "Some String";
如果没有正确定义变量的类型,Typescript 会抛出错误。例如,let x:string = 5
会抛出以下错误:
Type 'number' is not assignable to type 'string'.
在 Typescript 中定义对象类型#
对象在 Javascript 中无处不在,在 Typescript 中也不例外。Typescript 中的对象是 type object
,但对象内部的值也有自己的类型。在最基本的例子中,我们可以将变量定义为类型对象,它引用任意长度或值集的对象:
let myObject:object = { a: 1 };
如果我们想要更复杂一点,我们还可以在对象中定义预期的属性类型。假设我们有一个对象,其中有 3 个属性:
- 名称,类型
string
- 年龄,类型
number
- 兴趣类型
object
,其中兴趣是可选的
我们可以使用以下格式明确定义每一个:
let userOne:{ name: string, age: number, interests?: object } = { name: "John Doe", age: 24, interests: [ 'skiing', 'hiking', 'surfboarding' ] };
您可能会注意到,这变得有点混乱!通常,当我们这样做时,我们会创建自定义类型。您可以在此处了解有关自定义类型的更多信息,但作为示例,这里是使用自定义类型的相同代码:
type User = {
name: string,
age: number,
interests?: object
}
let userOne:User = { name: "John Doe", age: 24, interests: [ 'skiing', 'hiking', 'surfboarding' ] };
现在我们有了一个很好的干净User
类型,可以应用于任何变量或函数。接下来,让我们看看数组。
在 Typescript 中定义数组类型#
由于数组和对象可以包含它们自己的类型,因此我们定义它们的方式略有不同。对于数组,定义类型的最基本方法是使用type[]
语法。例如,一个字符串数组如下所示:
let arrayOfStrings:string[] = [ 'some', 'strings' ];
在这里,string
可以替换为任何其他有效类型。如果我们知道将出现在数组中的元素的确切数量和类型,我们可以这样定义它:
let myArray:[ string, number ] = [ "some", 15 ]
在 Typescript 中,当我们像这样定义一个具有固定类型和固定长度的数组时,它被称为Tuple
.
Typescript 中的混合数组类型
有时,数组可能由多种类型组成,但长度未知。在这种情况下,我们可以使用联合类型。例如,一个仅由字符串和数字组成的未知长度数组,看起来可以这样定义:
let myArray:(string|number)[] = [ "some", 15 ]
同样,对于更复杂的类型,我们可能想要定义自己的类型。您可以在此处了解有关自定义类型的更多信息。
在函数中使用 Typescript 类型#
同样的原则最终也适用于函数——这里唯一的区别是函数通常也有返回值。让我们从一个没有返回函数的简单示例开始。请注意,我们在函数中定义了每个参数的类型:
function generateName(firstName: string, lastName: string) {
console.log(`Hello ${firstName} ${lastName}`)
}
// Run the function
generateName("John", "Doe");
这个函数将成功运行,因为我们在运行函数时已经给出了正确的类型(即两个参数都是字符串)。
Typescript 和 Javascript 之间的一个根本区别是,如果我们要 run generateName("John");
,Typescript 会给我们以下错误:
Expected 2 arguments, but got 1.
由于 Typescript 比 Javascript 严格得多,因此它需要两个参数 – 而不是一个。如果我们想让它起作用,我们必须明确告诉 Typescript 参数 2 是可选的。我们可以通过?
在第二个参数之后添加 a 来做到这一点。因此,以下代码工作正常,没有错误:
function generateName(firstName: string, lastName?: string) {
console.log(`Hello ${firstName} ${lastName}`)
}
// Run the function
generateName("John");
在具有返回类型的函数中使用 Typescript
在 Typescript 中添加返回类型很简单。如果一个函数使用关键字返回一些东西return
,我们可以强制数据return
应该是什么类型。因为我们什么都不返回——所以我们的返回类型被称为void
.
如果我们想将返回类型添加到这个函数,我们使用相同的:
,所以我们的代码如下所示:
// Note that we have added : void!
function generateName(firstName: string, lastName: string): void {
console.log(`Hello ${firstName} ${lastName}`)
}
// Run the function
generateName("John", "Doe");
现在 Typescript 知道这个函数永远不会返回任何东西。如果它开始返回一些东西,typescript 会抛出一个错误:
Type 'string' is not assignable to type 'void'.
因此,Typescript 有助于保护我们免受试图在函数中返回数据的未知代码片段的影响。假设我们想将函数更改为return
,而不是console.log
。由于我们的返回类型为string
,我们只需将函数的返回类型更改为string
:
function generateName(firstName: string, lastName: string): string {
return `Hello ${firstName} ${lastName}`;
}
// Run the function
let firstUser = generateName("John", "Doe");
在 Typescript 中将函数编写为变量
Javascript 有一个共同的符号,其中函数被写为变量。在 Typescript 中,我们也可以这样做,我们只需要预先定义类型。如果我们想将上面的函数转换为变量格式,它看起来像这样:
let generateName:(firstName: string, lastName: string) => string = function(firstName, lastName) {
return `Hello ${firstName} ${lastName}`;
}
请注意这里的一个小区别,即返回类型是 after =>
,而不是:
。另请注意,我们没有为或本身定义类型-firstName
这是因为我们将它们定义为变量的一部分 – 所以不需要再次这样做。lastName
function()
结论#
在此之后,您应该对 Typescript 中的类型如何工作有一个很好的理解。在本文中,我们介绍了:
- 基本和最常见的 Typescript 类型
- 如何在 Typescript 中定义变量和函数类型
- 如何在 Typescript 中设置函数的返回类型
- 在 Typescript 中为对象创建基本的自定义类型
- 如何在 Typescript 中创建数组和元组类型
我希望你喜欢这篇关于 Typescript 类型的介绍。你可以在这里找到更多的 Typescript 内容。