基本类型
Typescript 允许我们将类型分配给变量,以便编译器检查我们没有为变量分配错误的值。您应该熟悉您学习过的其他语言的类型检查,例如 C# 或 Java。Typescript 类型声明的一个简单示例如下所示。
var num : number = 23;
这里的“:”符号用于引入类型声明“数字”,这是 Typescript 中的基本类型之一。这意味着无论在哪里使用变量 num,Typescript 编译器都会检查是否为变量分配了一个数字,如果没有,则给出错误。
在Typescript(和JavaScript)中,基本类型是:
boolean - true或false
number - 整数或浮点数(两者都可以)
string - 常规字符串
any - 可以是任意类型
void - 没有值(类似于C#和Java中的void函数)
never - 用于永远不返回的函数
null - JavaScript的空值
undefined - JavaScript的未定义值
null和undefined类型实际上是其他类型的子类型。它们的存在允许我们在单独查看联合类型时指定是否允许使用null或undefined作为值。
还有描述JavaScript结构的结构类型:
数组
数组可以声明为包含一种类型的元素,例如
var ilist : number[] = [1, 2, 3];
元组
元组是一个固定长度的数组,可能具有不同的元素类型,例如
var tup : [number, string]= [23, "abc"];
枚举(Enum)
枚举类似于C#或Java,并允许我们声明一个具有一组允许值的类型,例如:
enum Status {running, paused, stopped, finished};
var myStatus: Status = Status.paused;
类型断言(Type Assertions)
除了使用类型声明(如上面的示例)之外,我们还可以使用类型断言。断言意味着程序员比类型系统更清楚。它允许程序员添加对编译器不明确的类型信息。这在Typescript中非常有用,因为它必须与无类型的JavaScript兼容。它允许程序员对无类型代码的类型进行“断言”。
类型断言有两种形式:
<thetype> myvar
myvar as thetype
它们在功能上是相同的。例如,假设我们有一个字符串:
var myString = "hello world" // a Javascript declaration
我们可以通过两个 Typescript 语句中的任何一个以很好的类型化方式在代码中获取字符串的长度:
var stringLength1 : number = (<string> mystring).length;
var stringLength2 : number = (mystring as string).length;
请注意,我们必须插入括号以确保类型断言仅应用于变量。类型断言与类型转换相关,我们将在本主题后面介绍。
块级作用域 - let语句
最后,在这个部分中,我们需要解释一下let语句。在下面的示例中,您将看到let语句始终代替var语句使用。在Typescript中,let语句用于对变量施加更严格的作用域限制。实际上,let语句使变量的行为更像您在C#或Java中习惯的行为。一个区别的示例是以下完全有效的JavaScript代码序列:
n = 23;
var n;
在您习惯的语言中,这会导致错误,因为在找到第一个语句时不会声明变量。JavaScript 有一个更奇特的范围界定行为,你将在下面的活动中看到。let 语句从传统的类型语言角度纠正了这种行为。例如,以下代码序列将导致编译器语法错误。
n = 23; // syntax error because n is not declared before here
let n;
从现在开始,我们将使用 let 语句在我们的示例中声明变量。
对于永不更改的变量,有一种特殊形式的 let 语句。这是常量语句。假设我们有以下声明。
const n = 23;
在这里,我们声明一个变量 n,该变量初始化为值 23。它与使用 var 或 let 语句创建的变量不同,因为 Typescript 将阻止在声明后为其分配任何其他值。如果尝试对值的更改进行编码,编译器将显示错误。
复杂数据类型
Typescript引入了一些有趣的数据结构,我们可以在我们的程序中使用。现在我们来看一下枚举、数组和元组数据类型。
枚举
枚举声明了一组可以用于变量内容的符号。在Typescript和其他语言中,这些变量映射到整数值,但这些整数值在程序中是隐藏的,程序中使用有意义的标识符进行编程。
下面的枚举为Color数据类型定义了一些符号:
enum Colour {red, white, blue, yellow};
我们可以声明一个变量并初始化它,如下所示:
let col:Colour = Colour.yellow;
到目前为止,这类似于 C# 或 Java 中的枚举。但是,Typescript 中有一些独特的行为。请考虑以下您希望工作的 if 语句:
if (col == Colour.red) { … }
这将给出一个 Typescript 语法错误“== 运算符不能应用于类型 Color.yellow 和 Color.red”。在这种情况下,当您期望两个枚举值具有可比性时,Typescript 似乎会给出错误。有一些技术原因导致情况并非如此。我们必须比较枚举变量的方法是使用它们的数值等价物。例如,我们可以更改上面的 if 语句来消除问题:
if (col == <number>Colour.red) { … }
这里的<number>
语法是将枚举值转换为数字类型的类型转换。在需要进行比较的情况下,例如在switch
语句中,您需要进行这样的转换。
数组
Typescript 还对数组类型使用特殊语法。简单的一维数值数组可以声明如下:
let luckyNumbers: number[] = [7, 8, 23, 88];
这是用于任何类型的数组的形式。你可能还记得 JavaScript 允许数组中的任何类型的元素。Typescript 没有,它检查所有元素是否为同一类型。
我们还可以初始化一个数组对象,其中不存储任何对象。为此,我们可以使用 Array 类,它类似于 Java Array 类。例如:
let array1: string[] = new Array(4); // new array with slots for 4 elements
let array2: string[] = new Array(0); // new array with slots for zero elements
第二个示例反映了与其他语言不同的JavaScript数组的结构。JavaScript 数组的大小可以通过简单地将数据存储在新索引中来自动更改。您使用的其他语言将对数组强制使用固定大小,并在超出固定大小使用索引时产生运行时错误。
元组
let student1 : [string, number] = ["Reza",23];
此变量中的值始终有两个元素,第一个是字符串,第二个是数字。要访问这些值,我们使用数组访问语法,如以下两个语句所示:
console.log(student1[0]); // prints “Reza” on console log
student1[0]="Baz"; // changes the first value to the string “Baz”
这看起来类似于JavaScript,但Typescript检查类型以确保索引和元素的类型是应有的。例如,以下语句将生成类型错误:
student1[0] = 17; // type error – must be a string