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