TypeScript - 快速指南


TypeScript - 概述

JavaScript 是作为客户端语言引入的。Node.js 的发展也标志着 JavaScript 成为一种新兴的服务器端技术。然而,随着 JavaScript 代码的增长,它往往会变得更加混乱,从而导致代码的维护和重用变得困难。此外,它未能接受面向对象、强类型检查和编译时错误检查的功能,这使得 JavaScript 无法作为成熟的服务器端技术在企业级取得成功。TypeScript 的出现就是为了弥补这一差距。

什么是 TypeScript?

根据定义,“TypeScript 是用于应用程序规模开发的 JavaScript。”

TypeScript 是一种强类型、面向对象的编译语言。它是由Microsoft 的Anders Hejlsberg(C# 设计师)设计的。TypeScript 既是一种语言,也是一组工具。TypeScript 是编译为 JavaScript 的 JavaScript 的类型化超集。换句话说,TypeScript 是 JavaScript 加上一些附加功能。

TypeScript 图

TypeScript 的特点

TypeScript 只是 JavaScript。TypeScript 以 JavaScript 开始,以 JavaScript 结束。Typescript 采用了 JavaScript 程序的基本构建块。因此,您只需要了解 JavaScript 即可使用 TypeScript。为了执行目的,所有 TypeScript 代码都会转换为其等效的 JavaScript。

TypeScript 支持其他 JS 库。编译后的 TypeScript 可以从任何 JavaScript 代码中使用。TypeScript 生成的 JavaScript 可以重用所有现有的 JavaScript 框架、工具和库。

JavaScript 是 TypeScript。这意味着任何有效的.js文件都可以重命名为.ts并与其他 TypeScript 文件一起编译。

TypeScript 是可移植的。TypeScript 可跨浏览器、设备和操作系统移植。它可以在任何 JavaScript 运行的环境中运行。与同类产品不同,TypeScript 不需要专用的虚拟机或特定的运行时环境来执行。

TypeScript 和 ECMAScript

ECMAScript 规范是脚本语言的标准化规范。ECMA-262 已发布六个版本。该标准的第 6 版代号为“Harmony”。TypeScript 与 ECMAScript6 规范保持一致。

TypeScript 和 ECMAScript

TypeScript 采用了 ECMAScript5 规范(即 JavaScript 的官方规范)的基本语言特性。TypeScript 语言功能(例如模块和基于类的方向)符合 EcmaScript 6 规范。此外,TypeScript 还包含泛型和类型注释等不属于 EcmaScript6 规范的功能。

为什么使用 TypeScript?

TypeScript 优于 CoffeeScript 和 Dart 等其他编程语言,因为 TypeScript 是 JavaScript 的扩展。相比之下,像 Dart、CoffeeScript 这样的语言本身就是新语言,需要特定于语言的执行环境。

TypeScript 的好处包括 -

  • 编译- JavaScript 是一种解释性语言。因此,需要运行它来测试它是否有效。这意味着您编写所有代码只是为了找不到输出,以防出现错误。因此,您必须花费数小时尝试查找代码中的错误。TypeScript 转译器提供错误检查功能。如果 TypeScript 发现某种语法错误,它将编译代码并生成编译错误。这有助于在脚本运行之前突出显示错误。

  • 强静态类型- JavaScript 不是强类型的。TypeScript 通过 TLS(TypeScript 语言服务)附带可选的静态类型和类型推断系统。未声明类型的变量的类型可以由 TLS 根据其值来推断。

  • TypeScript支持现有 JavaScript 库的类型定义。TypeScript 定义文件(扩展名为.d.ts)提供外部 JavaScript 库的定义。因此,TypeScript 代码可以包含这些库。

  • TypeScript支持面向对象编程概念,如类、接口、继承等。

TypeScript 的组件

从本质上讲,TypeScript 具有以下三个组件 -

  • 语言- 它由语法、关键字和类型注释组成。

  • TypeScript 编译器- TypeScript 编译器 (tsc) 将用 TypeScript 编写的指令转换为其等效的 JavaScript 指令。

  • TypeScript 语言服务- “语言服务”在核心编译器管道周围公开了一个附加层,这些管道是类似编辑器的应用程序。语言服务支持一组常见的典型编辑器操作,例如语句完成、签名帮助、代码格式化和大纲、着色等。

TypeScript 组件

声明文件

编译 TypeScript 脚本时,可以选择生成声明文件(扩展名为.d.ts),该文件充当已编译 JavaScript 中组件的接口。声明文件的概念类似于 C/C++ 中的头文件的概念。声明文件(扩展名为.d.ts 的文件)为 jQuery、MooTools 等 JavaScript 库提供类型、函数调用和变量支持的智能感知。

TypeScript - 环境设置

我们已经在线设置了 TypeScript 编程,以便您在进行理论工作时可以同时在线执行所有可用的示例。这使您对所阅读的内容充满信心,并使用不同的选项检查结果。请随意修改任何示例并在线执行。

var message:string = "Hello World" 
console.log(message)

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var message = "Hello World";
console.log(message);

在本章中,我们将讨论如何在 Windows 平台上安装 TypeScript。我们还将解释如何安装 Brackets IDE。

您可以使用www.typescriptlang.org/Playground上的 The TypeScript 在线测试您的脚本。在线编辑器显示编译器发出的相应 JavaScript。

TypeScript 在线测试

您可以使用Playground尝试以下示例。

var num:number = 12 
console.log(num)

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var num = 12;
console.log(num);

上述程序的输出如下 -

12

本地环境设置

Typescript 是一种开源技术。它可以在任何浏览器、任何主机和任何操作系统上运行。您将需要以下工具来编写和测试 Typescript 程序 -

文本编辑器

文本编辑器可以帮助您编写源代码。一些编辑器的示例包括 Windows Notepad、Notepad++、Emacs、vim 或 vi 等。使用的编辑器可能因操作系统而异。

源文件通常以扩展名.ts命名

TypeScript 编译器

TypeScript 编译器本身就是一个编译为 JavaScript (.js) 文件的.ts文件。TSC(TypeScript Compiler)是一个源到源的编译器(transcompiler/transpiler)。

TypeScript 编译器

TSC 生成传递给它的.ts文件的 JavaScript 版本。换句话说,TSC 从作为输入给出的 Typescript 文件生成等效的 JavaScript 源代码。这个过程称为转译。

但是,编译器会拒绝传递给它的任何原始 JavaScript 文件。编译器仅处理.ts.d.ts文件。

安装 Node.js

Node.js 是一个用于服务器端 JavaScript 的开源、跨平台运行时环境。Node.js 需要在没有浏览器支持的情况下运行 JavaScript。它使用 Google V8 JavaScript 引擎来执行代码。您可以下载 Node.js 源代码或适合您平台的预构建安装程序。节点可在此处使用 - https://nodejs.org/en/download

在 Windows 上安装

按照以下步骤在 Windows 环境中安装 Node.js。

步骤 1 - 下载并运行 Node.js 的 .msi 安装程序。

下载并运行安装程序

步骤 2 - 要验证安装是否成功,请在终端窗口中输入命令node –v 。

验证安装

步骤 3 - 在终端窗口中键入以下命令来安装 TypeScript。

npm install -g typescript

安装 TypeScript

在 Mac OS X 上安装

要在 Mac OS X 上安装 node.js,您可以下载预编译的二进制包,这使得安装变得非常简单。前往http://nodejs.org/并单击安装按钮下载最新的软件包。

下载最新包

按照安装向导安装.dmg中的软件包,该向导将同时安装 node 和npm。npm 是 Node 包管理器,它有助于安装 Node.js 的附加包。

安装节点

在 Linux 上安装

在安装 Node.js 和 NPM 之前,您需要安装一些依赖项。

安装这些依赖项后,您可以在终端上使用以下命令来安装 Node.js -

brew install node.

IDE支持

Typescript 可以构建在多种开发环境上,例如 Visual Studio、Sublime Text 2、WebStorm/PHPStorm、Eclipse、Brackets 等。此处讨论 Visual Studio Code 和 Brackets IDE。这里使用的开发环境是Visual Studio Code(Windows平台)。

视觉工作室代码

这是 Visual Studio 的开源 IDE。它适用于 Mac OS X、Linux 和 Windows 平台。VScode 位于 - https://code.visualstudio.com/

在 Windows 上安装

步骤 1 -下载适用于 Windows 的 Visual Studio Code

下载 Visual Studio 代码

步骤 2 - 双击 VSCodeSetup.exe启动设置过程以启动安装过程。这只需要一分钟。

设置向导

步骤 3 - 下面给出了 IDE 的屏幕截图。

集成开发环境

步骤 4 - 您可以通过右键单击文件 → 在命令提示符中打开来直接遍历到文件的路径。同样,“在资源管理器中显示”选项会在文件资源管理器中显示文件。

遍历文件路径

在 Mac OS X 上安装

Visual Studio Code 的 Mac OS X 特定安装指南可以在以下位置找到:

https://code.visualstudio.com/Docs/editor/setup

在 Linux 上安装

Visual Studio Code 的 Linux 特定安装指南可以在以下位置找到:

https://code.visualstudio.com/Docs/editor/setup

括号

Brackets 是一款用于 Web 开发的免费开源编辑器,由 Adob​​e Systems 创建。它适用于 Linux、Windows 和 Mac OS X。Brackets 位于http://brackets.io/

括号

括号的 TypeScript 扩展

Brackets 支持通过扩展管理器添加额外功能的扩展。以下步骤解释了如何使用相同的方法安装 TypeScript 扩展。

  • 安装后,单击扩展管理器编辑器右侧的扩展管理器图标。在搜索框中输入打字稿。

  • 安装 Brackets TSLint 和 Brackets TypeScript 插件。

TypeScript 扩展

您可以通过添加一个扩展 Brackets Shell 在 Brackets 本身内运行 DOS 提示符/shell。

支架外壳

安装后,您将在编辑器的右侧看到一个 shell 图标壳。单击该图标后,您将看到 shell 窗口,如下所示 -

外壳窗口

注意- Typescript 还可以作为 Visual Studio 2012 和 2013 环境的插件使用(https://www.typescriptlang.org/#Download)。VS 2015 及更高版本默认包含 Typescript 插件。

现在,一切都准备好了!!!

TypeScript - 基本语法

语法定义了一组编写程序的规则。每种语言规范都定义了自己的语法。TypeScript 程序由以下部分组成:

  • 模块
  • 功能
  • 变量
  • 陈述和表达式
  • 评论

你的第一个 TypeScript 代码

让我们从传统的“Hello World”示例开始 -

var message:string = "Hello World" 
console.log(message)

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var message = "Hello World";
console.log(message);
  • 第 1 行通过名称 message 声明一个变量。变量是程序中存储值的一种机制。

  • 第 2 行将变量的值打印到提示符处。这里,控制台指的是终端窗口。函数log()用于在屏幕上显示文本。

编译并执行 TypeScript 程序

让我们看看如何使用 Visual Studio Code 编译和执行 TypeScript 程序。请按照以下步骤操作 -

步骤 1 - 使用 .ts 扩展名保存文件。我们将文件保存为 Test.ts。保存代码时,代码编辑器会标记代码中的错误(如果有)。

步骤 2 - 右键单击​​ VS Code 的浏览窗格中“工作文件”选项下的 TypeScript 文件。选择“在命令提示符中打开”选项。

编译并执行

步骤 3 - 要编译文件,请在终端窗口上使用以下命令。

tsc Test.ts

步骤 4 - 该文件被编译为 Test.js。要运行编写的程序,请在终端中键入以下内容。

node Test.js

编译器标志

编译器标志使您能够在编译期间更改编译器的Behave。每个编译器标志都会公开一个设置,允许您更改编译器的Behave方式。

下表列出了与 TSC 编译器相关的一些常见标志。典型的命令行用法使用部分或全部开关。

编号 编译器标志和说明
1.

- 帮助

显示帮助手册

2.

- 模块

加载外部模块

3.

- 目标

设置目标 ECMA 版本

4.

- 宣言

生成额外的 .d.ts 文件

5.

--删除评论

从输出文件中删除所有注释

6.

- 出去

将多个文件编译成单个输出文件

7.

--源图

生成源映射 (.map) 文件

8.

--模块 noImplicitAny

禁止编译器推断任何类型

9.

- 手表

监视文件更改并即时重新编译它们

注意- 可以一次编译多个文件。

tsc file1.ts, file2.ts, file3.ts

TypeScript 中的标识符

标识符是赋予程序中的元素(如变量、函数等)的名称。标识符的规则是 -

  • 标识符可以包括字符和数字。但是,标识符不能以数字开头。

  • 标识符不能包含除下划线 (_) 或美元符号 ($) 之外的特殊符号。

  • 标识符不能是关键字。

  • 它们必须是独一无二的。

  • 标识符区分大小写。

  • 标识符不能包含空格。

下表列出了有效和无效标识符的一些示例 -

有效标识符 无效的标识符
瓦尔
数字1
$结果 1号

TypeScript ─ 关键字

关键字在语言上下文中具有特殊含义。下表列出了 TypeScript 中的一些关键字。

休息 作为 任何 转变
案件 如果 别的
变量 数字 细绳 得到
模块 类型 实例化 类型
民众 私人的 枚举 出口
最后 为了 尽管 空白
无效的 极好的 新的
返回 真的 错误的
任何 延伸 静止的
包裹 实施 界面 功能
新的 尝试 屈服 常量
继续 抓住

空格和换行符

TypeScript 会忽略程序中出现的空格、制表符和换行符。您可以在程序中自由使用空格、制表符和换行符,并且可以以整洁一致的方式自由地格式化和缩进程序,使代码易于阅读和理解。

TypeScript 区分大小写

TypeScript 区分大小写。这意味着 TypeScript 区分大写和小写字符。

分号是可选的

每行指令称为一条语句。在 TypeScript 中分号是可选的。

例子

console.log("hello world")
console.log("We are learning TypeScript")

一行可以包含多个语句。但是,这些语句必须用分号分隔。

TypeScript 中的注释

注释是提高程序可读性的一种方法。注释可用于包含有关程序的附加信息,例如代码作者、有关函数/构造的提示等。编译器会忽略注释。

TypeScript 支持以下类型的注释 -

  • 单行注释 ( // ) - // 和行尾之间的任何文本都被视为注释

  • 多行注释 (/* */) - 这些注释可能跨越多行。

例子

//this is single line comment 
 
/* This is a  
   Multi-line comment 
*/

TypeScript 和面向对象

TypeScript 是面向对象的 JavaScript。面向对象是一种遵循现实世界建模的软件开发范例。面向对象将程序视为对象的集合,这些对象通过称为方法的机制相互通信。TypeScript 也支持这些面向对象的组件。

  • 对象- 对象是任何实体的实时表示。根据 Grady Brooch 的说法,每个物体都必须具有三个特征 -

    • 状态- 由对象的属性描述

    • Behave- 描述对象将如何行动

    • 身份- 将一个对象与一组类似的对象区分开来的唯一值。

  • - OOP 中的类是创建对象的蓝图。类封装了对象的数据。

  • 方法- 方法促进对象之间的通信。

示例:TypeScript 和面向对象

class Greeting { 
   greet():void { 
      console.log("Hello World!!!") 
   } 
} 
var obj = new Greeting(); 
obj.greet();

上面的示例定义了一个类Greeting。该类有一个方法greet()。该方法在终端上打印字符串“Hello World”。new关键字创建该类的对象 (obj)。该对象调用greet()方法。

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var Greeting = (function () {
   function Greeting() {
   }
   Greeting.prototype.greet = function () {
      console.log("Hello World!!!");
   };
	return Greeting;
}());

var obj = new Greeting();
obj.greet()

上述程序的输出如下 -

Hello World!!!

TypeScript - 类型

类型系统表示该语言支持的不同类型的值。在程序存储或操作所提供的值之前,类型系统会检查它们的有效性。这确保了代码的Behave符合预期。类型系统还允许更丰富的代码提示和自动化文档。

TypeScript 提供数据类型作为其可选类型系统的一部分。数据类型分类如下 -

数据类型

任意类型

Any数据类型是 TypeScript 中所有类型的超类型。它表示动态类型。使用any类型相当于选择不进行变量的类型检查。

内置类型

下表说明了 TypeScript 中的所有内置类型 -

数据类型 关键词 描述
数字 数字 双精度 64 位浮点值。它可以用来表示整数和分数。
细绳 细绳 表示 Unicode 字符序列
布尔值 布尔值 代表逻辑值,true 和 false
空白 空白 用于函数返回类型来表示非返回函数
无效的 无效的 表示故意缺少对象值。
不明确的 不明确的 表示赋予所有未初始化变量的值

注意- TypeScript 和 JavaScript 中没有整数类型。

Null 和 undefined ─ 它们是一样的吗?

null和未定义的数据类型通常造成混乱。null 和 undefined 不能用于引用变量的数据类型。它们只能作为值分配给变量。

但是,null 和 undefined 并不相同。用 undefined 初始化的变量意味着该变量没有分配任何值或对象,而 null 则意味着该变量已被设置为值未定义的对象。

用户定义类型

用户定义类型包括枚举(enum)、类、接口、数组和元组。这些将在后面的章节中详细讨论。

TypeScript - 变量

根据定义,变量是“内存中存储值的命名空间”。换句话说,它充当程序中值的容器。TypeScript 变量必须遵循 JavaScript 命名规则 -

  • 变量名称可以包含字母和数字。

  • 它们不能包含空格和特殊字符,下划线 (_) 和美元 ($) 符号除外。

  • 变量名不能以数字开头。

变量必须在使用之前声明。使用var关键字来声明变量。

TypeScript 中的变量声明

在 TypeScript 中声明变量的类型语法是在变量名称后面包含一个冒号 (:),后跟其类型。就像在 JavaScript 中一样,我们使用var关键字来声明变量。

当你声明一个变量时,你有四个选项 -

  • 在一条语句中声明其类型和值。

声明类型
  • 声明其类型但不声明值。在这种情况下,该变量将被设置为未定义。

不明确的
  • 声明其值但不声明类型。变量类型将设置为指定值的数据类型。

任何
  • 既不声明值也不声明类型。在这种情况下,变量的数据类型将为any,并将被初始化为未定义。

任意和未定义

下表说明了上面讨论的变量声明的有效语法 -

编号 变量声明语法和描述
1.

变量名称:字符串=“玛丽”

该变量存储字符串类型的值

2.

变量名称:字符串;

该变量是一个字符串变量。变量的值默认设置为未定义

3.

变量名称=“玛丽”

变量的类型是从值的数据类型推断出来的。这里,变量是字符串类型

4.

变量名称;

变量的数据类型是any。默认情况下,其值设置为未定义。

示例:TypeScript 中的变量

var name:string = "John"; 
var score1:number = 50;
var score2:number = 42.50
var sum = score1 + score2 
console.log("name"+name) 
console.log("first score: "+score1) 
console.log("second score: "+score2) 
console.log("sum of the scores: "+sum)

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var name = "John";
var score1 = 50;
var score2 = 42.50;
var sum = score1 + score2;
console.log("name" + name);
console.log("first score: " + score1);
console.log("second score : " + score2);
console.log("sum of the scores: " + sum);

上述程序的输出如下 -

name:John 
first score:50 
second score:42.50 
sum of the scores:92.50

如果我们尝试将值分配给不同类型的变量,TypeScript 编译器将生成错误。因此,TypeScript 遵循强类型。强类型语法确保赋值运算符 (=) 两侧指定的类型相同。这就是为什么以下代码会导致编译错误 -

var num:number = "hello"     // will result in a compilation error

TypeScript 中的类型断言

TypeScript 允许将变量从一种类型更改为另一种类型。TypeScript 将此过程称为类型断言。语法是将目标类型放在 < > 符号之间,并将其放在变量或表达式的前面。下面的例子解释了这个概念 -

例子

var str = '1' 
var str2:number = <number> <any> str   //str is now of type number 
console.log(typeof(str2))

如果将鼠标指针悬停在 Visual Studio Code 中的类型断言语句上,它将显示变量数据类型的更改。基本上,如果 S 是 T 的子类型或 T 是 S 的子类型,则它允许从类型 S 到 T 的断言成功。

之所以不称为“类型转换”,是因为转换通常意味着某种运行时支持,而“类型断言”纯粹是一种编译时构造,是一种向编译器提供有关您希望代码如何执行的提示的方法。进行分析。

编译时,它将生成以下 JavaScript 代码。

"use strict";
var str = '1';
var str2 = str; //str is now of type number 
console.log(typeof (str2));

它将产生以下输出 -

string

TypeScript 中的推断类型

鉴于 Typescript 是强类型的,因此此功能是可选的。TypeScript 还鼓励变量的动态类型。这意味着,TypeScript 鼓励声明没有类型的变量。在这种情况下,编译器将根据分配给变量的值来确定变量的类型。TypeScript 将在代码中找到该变量的第一次使用,确定其最初设置的类型,然后在代码块的其余部分中假定该变量的类型相同。

下面的代码片段解释了同样的情况 -

示例:推断类型

var num = 2;    // data type inferred as  number 
console.log("value of num "+num); 
num = "12";
console.log(num);

在上面的代码片段中 -

  • 该代码声明了一个变量并将其值设置为 2。请注意,变量声明未指定数据类型。因此,程序使用推断类型来确定变量的数据类型,即,它分配变量设置的第一个值的类型。在本例中,num设置为类型编号。

  • 当代码尝试将变量的值设置为字符串时。由于变量的类型已设置为数字,编译器会引发错误。

它将产生以下输出 -

error TS2011: Cannot convert 'string' to 'number'.

TypeScript 变量作用域

变量的范围指定变量的定义位置。程序中变量的可用性由其范围决定。TypeScript 变量可以具有以下范围 -

  • 全局范围- 全局变量在编程结构之外声明。可以从代码中的任何位置访问这些变量。

  • 类范围- 这些变量也称为字段。字段或类变量在类内部但在方法外部声明。可以使用类的对象来访问这些变量。字段也可以是静态的。可以使用类名访问静态字段。

  • 局部作用域- 顾名思义,局部变量是在方法、循环等构造中声明的。局部变量只能在声明它们的构造中访问。

以下示例说明了 TypeScript 中的变量范围。

示例:变量范围

var global_num = 12          //global variable 
class Numbers { 
   num_val = 13;             //class variable 
   static sval = 10;         //static field 
   
   storeNum():void { 
      var local_num = 14;    //local variable 
   } 
} 
console.log("Global num: "+global_num)  
console.log(Numbers.sval)   //static variable  
var obj = new Numbers(); 
console.log("Global num: "+obj.num_val) 

转译时,会生成以下 JavaScript 代码 -

var global_num = 12;              //global variable 
var Numbers = (function () {
   function Numbers() {
      this.num_val = 13;          //class variable 
   }
   Numbers.prototype.storeNum = function () {
      var local_num = 14;        //local variable 
   };
   Numbers.sval = 10;            //static field 
   return Numbers;
}());

console.log("Global num: " + global_num);
console.log(Numbers.sval);       //static variable  

var obj = new Numbers();
console.log("Global num: " + obj.num_val);

它将产生以下输出 -

Global num: 12
10
Global num: 13

如果尝试在方法外部访问局部变量,则会导致编译错误。

error TS2095: Could not find symbol 'local_num'.

TypeScript - 运算符

什么是操作员?

运算符定义将对数据执行的某些函数。运算符所处理的数据称为操作数。考虑以下表达式 -

7 + 5 = 12

这里,值 7、5 和 12 是操作数,而 + 和 = 是运算符

TypeScript 中的主要运算符可以分为:

  • 算术运算符
  • 逻辑运算符
  • 关系运算符
  • 按位运算符
  • 赋值运算符
  • 三元/条件运算符
  • 字符串运算符
  • 类型运算符

算术运算符

假设变量a和b的值分别为10和5。

显示示例

操作员 描述 例子
+(加法) 返回操作数的和 a + b 是 15
-(减法) 返回值的差值 a - b 为 5
*(乘法) 返回值的乘积 a * b 为 50
/ (分配) 执行除法运算并返回商 a/b 为 2
%(模数) 执行除法运算并返回余数 a % b 为 0
++(增量) 将变量的值加一 a++ 是 11
--(递减) 将变量的值减一 a-- 是 9

关系运算符

关系运算符测试或定义两个实体之间的关系类型。关系运算符返回一个布尔值,即 true/false。

假设A的值为10,B的值为20。

显示示例

操作员 描述 例子
> 比...更棒 (A > B) 为假
< 小于 (A < B) 为真
>= 大于或等于 (A >= B) 为假
<= 小于或等于 (A <= B) 为真
== 平等 (A == B) 为假
!= 不等于 (A != B) 为真

逻辑运算符

逻辑运算符用于组合两个或多个条件。逻辑运算符也返回布尔值。假设变量 A 的值为 10,B 的值为 20。

显示示例

操作员 描述 例子
&& (和) 仅当指定的所有表达式都返回 true 时,该运算符才返回 true (A > 10 && B > 10) 为假
|| (或者) 如果至少有一个指定的表达式返回 true,则该运算符返回 true (A > 10 || B >10) 为真
!(不是) 该运算符返回表达式结果的倒数。例如:!(>5) 返回 false !(A >10 ) 为真

按位运算符

假设变量 A = 2 且 B = 3

显示示例

操作员 描述 例子
&(按位与) 它对其整数参数的每一位执行布尔 AND 运算。 (A & B) 为 2
| (按位或) 它对其整数参数的每一位执行布尔 OR 运算。 (A | B) 为 3
^(按位异或) 它对其整数参数的每一位执行布尔异或运算。异或意味着操作数一为真或操作数二为真,但不能两者都为真。 (A^B) 为 1
~(按位非) 它是一个一元运算符,通过反转操作数中的所有位来进行运算。 (~B) 为 -4
<<(左移) 它将第一个操作数中的所有位向左移动第二个操作数中指定的位数。新的位用零填充。将值左移一位相当于乘以 2,左移两位相当于乘以 4,依此类推。 (A << 1) 是 4
>>(右移) 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 (A >> 1) 是 1
>>>(右移零) 该运算符与 >> 运算符类似,只是左侧移入的位始终为零。 (A >>> 1) 是 1

赋值运算符

显示示例

操作员 描述 例子
=(简单赋值) 将右侧操作数中的值分配给左侧操作数 C = A + B 将 A + B 的值赋给 C
+=(添加和赋值) 它将右操作数添加到左操作数,并将结果分配给左操作数。 C += A 等价于 C = C + A
-=(减法和赋值) 它从左操作数中减去右操作数,并将结果赋给左操作数。 C -= A 相当于 C = C - A
*=(乘法和赋值) 它将右操作数与左操作数相乘,并将结果赋给左操作数。 C *= A 相当于 C = C * A
/=(除法和赋值) 它将左操作数与右操作数相除,并将结果赋给左操作数。

注意- 相同的逻辑适用于按位运算符,因此它们将变为 <<=、>>=、>>=、&=、|= 和 ^=。

杂项运算符

否定运算符 (-)

更改值的符号。让我们举个例子。

var x:number = 4 
var y = -x; 
console.log("value of x: ",x);   //outputs 4 
console.log("value of y: ",y);   //outputs -4

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var x = 4;
var y = -x;
console.log("value of x: ", x);   //outputs 4
console.log("value of y: ", y);   //outputs -4

它将产生以下输出 -

value of x:  4 
value of y:  -4

字符串运算符:连接运算符 (+)

+ 运算符应用于字符串时会将第二个字符串附加到第一个字符串。下面的例子可以帮助我们理解这个概念。

var msg:string = "hello"+"world" 
console.log(msg)

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var msg = "hello" + "world";
console.log(msg);

它将产生以下输出 -

helloworld

连接操作不会在字符串之间添加空格。多个字符串可以连接在一个语句中。

条件运算符 (?)

该运算符用于表示条件表达式。条件运算符有时也称为三元运算符。语法如下 -

Test ? expr1 : expr2
  • 测试- 指条件表达式

  • expr1 - 如果条件为真则返回的值

  • expr2 - 如果条件为假则返回的值

让我们看一下下面的代码 -

var num:number = -2 
var result = num > 0 ?"positive":"non-positive" 
console.log(result)

第 2 行检查变量num中的值是否大于零。如果num设置为大于零的值,则返回字符串“正数”,否则返回字符串“非正数”。

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var num = -2;
var result = num > 0 ? "positive" : "non-positive";
console.log(result);

上面的代码片段将产生以下输出 -

non-positive

类型运算符

类型运算符

它是一个一元运算符。该运算符返回操作数的数据类型。看一下下面的例子 -

var num = 12 
console.log(typeof num);   //output: number

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var num = 12;
console.log(typeof num);   //output: number

它将产生以下输出 -

number

实例化

该运算符可用于测试对象是否属于指定类型。instanceof运算符的使用在类章中讨论。

TypeScript - 决策

决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及如果条件被确定为真则要执行的一条或多条语句,以及可选的如果条件成立则要执行的其他语句。条件被确定为假。

下面显示的是大多数编程语言中典型决策结构的一般形式 -

决策

决策结构在执行指令之前评估条件。TypeScript 中的决策结构分类如下 -

编号 声明及说明
1. if 语句

“if”语句由一个布尔表达式后跟一个或多个语句组成。

2. if...else 语句

“if”语句后面可以跟一个可选的“else”语句,该语句在布尔表达式为 false 时执行。

3. else...if 和嵌套 if 语句

您可以在另一个“if”或“else if”语句内使用一个“if”或“else if”语句。

4. switch语句

“switch”语句允许根据值列表测试变量。

TypeScript - 循环

您可能会遇到这样的情况:一段代码需要执行多次。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。

编程语言提供了各种控制结构,允许更复杂的执行路径。

循环语句允许我们多次执行一条语句或一组语句。下面给出的是大多数编程语言中循环语句的一般形式。

环形

TypeScript 提供了不同类型的循环来处理循环需求。下图说明了循环的分类 -

循环类型

定环

迭代次数是确定/固定的循环称为确定循环。for循环是确定循环的实现。

编号 循环和描述
1. for循环

for循环是确定循环的实现。

无限循环

当循环中的迭代次数不确定或未知时,使用不定循环。

可以使用以下方式实现不定循环 -

序列号 循环和描述
1. while 循环

每次指定的条件计算结果为 true 时,while 循环都会执行指令。

2. 做…同时

do...while 循环与 while 循环类似,不同之处在于 do...while 循环不会在循环第一次执行时评估条件。

示例:while 与 do..while

var n:number = 5 
while(n > 5) { 
   console.log("Entered while") 
} 
do { 
   console.log("Entered do…while") 
} 
while(n>5)

该示例最初声明了一个 while 循环。仅当传递给 while 的表达式计算结果为 true 时才进入循环。在此示例中,n 的值不大于零,因此表达式返回 false 并且跳过循环。

另一方面,do…while 循环执行语句一次。这是因为初始迭代不考虑布尔表达式。但是,对于后续迭代,while 检查条件并将控制移出循环。

编译时,它将生成以下 JavaScript 代码 -

//Generated by typescript 1.8.10
var n = 5;
while (n > 5) {
   console.log("Entered while");
}

do {
   console.log("Entered do…while");
} while (n > 5);

上面的代码将产生以下输出 -

Entered do…while

中断语句

Break语句用于从构造中取出控制权在循环中使用break会导致程序退出循环。其语法如下 -

句法

break

流程图

中断声明

例子

现在,看看下面的示例代码 -

var i:number = 1 
while(i<=10) { 
   if (i % 5 == 0) {   
      console.log ("The first multiple of 5  between 1 and 10 is : "+i) 
      break     //exit the loop if the first multiple is found 
   } 
   i++ 
}  //outputs 5 and exits the loop

编译时,它将生成以下 JavaScript 代码 -

//Generated by typescript 1.8.10
var i = 1;

while (i <= 10) {
   if (i % 5 == 0) {
      console.log("The first multiple of 5  between 1 and 10 is : " + i);
      break; //exit the loop if the first multiple is found
   }
   i++;
} //outputs 5 and exits the loop

它将产生以下输出 -

The first multiple of 5  between 1 and 10 is : 5

继续语句

continue语句跳过当前迭代中的后续语句,并将控制权返回到循环开头。与break 语句不同,Continue 不会退出循环。它终止当前迭代并开始后续迭代。

句法

continue

流程图

继续声明

例子

下面给出了 continue 语句的示例 -

var num:number = 0
var count:number = 0;

for(num=0;num<=20;num++) {
   if (num % 2==0) {
      continue
   }
   count++
}
console.log (" The count of odd values between 0 and 20 is: "+count)    //outputs 10 

上面的示例显示 0 到 20 之间的偶数值的数量。如果数量为偶数,则循环退出当前迭代。这是通过使用continue语句来实现的。

编译时,它将生成以下 JavaScript 代码。

//Generated by typescript 1.8.10
var num = 0;
var count = 0;

for (num = 0; num <= 20; num++) {
   if (num % 2 == 0) {
      continue;
   }
   count++;
}
console.log(" The count of odd values between 0 and 20 is: " + count);     //outputs 10

输出

The count of odd values between 0 and 20 is: 10

无限循环

无限循环是无限运行的循环。for循环while循环可以用来构成无限循环。

语法:使用 for 循环的无限循环

for(;;) { 
   //statements 
}

示例:使用 for 循环的无限循环

for(;;) { 
   console.log(“This is an endless loop”) 
}

语法:使用 while 循环进行无限循环

while(true) { 
   //statements 
} 

示例:使用 while 循环的无限循环

while(true) { 
   console.log(“This is an endless loop”) 
}

TypeScript - 函数

函数是可读、可维护和可重用代码的构建块。函数是执行特定任务的一组语句。函数将程序组织成逻辑代码块。一旦定义,就可以调用函数来访问代码。这使得代码可以重用。此外,函数使程序代码的阅读和维护变得容易。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

先生编号 功能及说明
1. 定义函数

函数定义指定特定任务的完成内容和方式。

2. 调用函数

必须调用函数才能执行它。

3. 返回函数

函数还可以将值与控制一起返回给调用者。

4. 参数化函数

参数是一种将值传递给函数的机制。

可选参数

当函数执行不需要强制传递参数时,可以使用可选参数。可以通过在参数名称后附加问号来将参数标记为可选。可选参数应设置为函数中的最后一个参数。声明带有可选参数的函数的语法如下 -

function function_name (param1[:type], param2[:type], param3[:type])

示例:可选参数

function disp_details(id:number,name:string,mail_id?:string) { 
   console.log("ID:", id); 
   console.log("Name",name); 
   
   if(mail_id!=undefined)  
   console.log("Email Id",mail_id); 
}
disp_details(123,"John");
disp_details(111,"mary","mary@xyz.com");
  • 上面的示例声明了一个参数化函数。这里,第三个参数mail_id是可选参数。

  • 如果在函数调用期间未向可选参数传递值,则该参数的值将设置为未定义。

  • 仅当向参数传递值时,该函数才会打印 mail_id 的值。

编译时,它将生成以下 JavaScript 代码 -

//Generated by typescript 1.8.10
function disp_details(id, name, mail_id) {
   console.log("ID:", id);
   console.log("Name", name);
	
   if (mail_id != undefined)
      console.log("Email Id", mail_id);
}
disp_details(123, "John");
disp_details(111, "mary", "mary@xyz.com");

上面的代码将产生以下输出 -

ID:123 
Name John 
ID: 111 
Name  mary 
Email Id mary@xyz.com

其余参数

剩余参数类似于 Java 中的变量参数。剩余参数不限制可以传递给函数的值的数量。但是,传递的值必须全部属于同一类型。换句话说,剩余参数充当相同类型的多个参数的占位符。

要声明剩余参数,参数名称以三个句点为前缀。任何非休息参数都应位于休息参数之前。

示例:剩余参数

function addNumbers(...nums:number[]) {  
   var i;   
   var sum:number = 0; 
   
   for(i = 0;i<nums.length;i++) { 
      sum = sum + nums[i]; 
   } 
   console.log("sum of the numbers",sum) 
} 
addNumbers(1,2,3) 
addNumbers(10,10,10,10,10)
  • 函数 addNumbers() 声明接受剩余参数nums。其余参数的数据类型必须设置为数组。此外,一个函数最多可以有一个剩余参数。

  • 该函数被调用两次,分别传递三个和六个值。

  • for 循环遍历参数列表,传递给函数并计算它们的总和。

编译时,它将生成以下 JavaScript 代码 -

function addNumbers() {
   var nums = [];
   for (var _i = 0; _i < arguments.length; _i++) {
      nums[_i - 0] = arguments[_i];
   }
	var i;
   var sum = 0;
	
   for (i = 0; i < nums.length; i++) {
      sum = sum + nums[i];
   }
   console.log("sum of the numbers", sum);
}
addNumbers(1, 2, 3);
addNumbers(10, 10, 10, 10, 10);

上述代码的输出如下 -

sum of numbers 6 
sum of numbers 50

默认参数

函数参数也可以默认赋值。但是,此类参数也可以显式传递值。

句法

function function_name(param1[:type],param2[:type] = default_value) { 
}

注意- 参数不能同时声明为可选和默认。

示例:默认参数

function calculate_discount(price:number,rate:number = 0.50) { 
   var discount = price * rate; 
   console.log("Discoun