TypeScript 什么是环境声明
TypeScirpt提供了一种更简单、更安全地使用第三方库(如Node.js、jQuery、AngularJS等)的方式,这是通过环境声明来实现的。
环境声明是一种告知TypeScript编译器的方法,真实的源代码(如函数或变量)存在于其他位置。如果我们尝试在运行时使用这些源代码但它们不存在,没有给出提示的话,代码将会出错。我们必须始终编写环境声明,如果我们的TypeScript代码需要使用第三方JavaScript库,如jQuery、AngularJS、Node.js等。
在使用这些JavaScript库,如jQuery、AngularJS、Node.js等时,验证代码补全和类型安全性对于TypeScript程序员来说变得困难。因此,环境声明有助于直接将其他JavaScript库集成到TypeScript中。
定义环境声明: 环境声明文件必须使用扩展名 d.ts 保存。在环境声明文件的每个根级定义前面都必须添加 declare 关键字,并且扩展名为 d.ts 。作者通过这个可以清楚地了解到TypeScript不会发布任何代码,作者需要确认在运行时已声明的项目将存在。
环境声明文件类似于文档文件(如果源代码发生更改,文档文件需要及时更新)。因此,如果环境声明文件不更新,它们将返回编译错误。按照约定,环境声明文件保存在具有扩展名为d.ts的类型声明文件中,如下所示:
Trial.d.ts
上述文件不能被转译为 JavaScript 文件。它可以用于代码自动补全和类型安全。
现在要声明环境方法和变量,我们必须使用 declare 关键字。声明环境变量或环境声明的语法如下:
语法:
declare module module_name {
}
在客户端TypeScript文件中提及环境文件的语法如下:
/// <reference path = "Trial.d.ts" />
特点: 以下是TypeScript中环境声明(ambient)的特点:
- 环境声明允许安全地使用现有的受欢迎的JavaScript库。
- 环境声明帮助直接将其他JavaScript库集成到TypeScript中。
- 环境声明是告诉编译器关于现有变量/函数等的一种方式。
- 环境声明中有一个declare关键字,意味着我们声明了一个变量的类型而没有实现它们,并且TypeScript会假设我们会以某种方式包含该实现(通过添加脚本标签或任何自定义编译器)。
应用: 在TypeScript中,环境用于描述不是用TypeScript编写的库的形状,为此我们必须声明该库所公开的API。这是因为JavaScript库很少公开顶级对象,更好的表示方法是使用命名空间。
我们在环境声明中使用declare关键字,意味着我们声明了一个变量的类型而没有实现它们,并且TypeScript会假设我们会以某种方式包含该实现(通过添加脚本标签或任何自定义编译器)。通常,它们被描述在.d.ts文件中。因此,我们必须编写一个环境模块,为已经用JavaScript编写的代码编写类型声明。如前所述,它们定义在以.d.ts文件扩展名结尾的文件中。
因此,基本上环境声明是与编译器进行的一种保证。如果第三方库在运行时不存在,我们尝试使用它们,可能会在没有警告的情况下出现错误。
示例1: 为了理解环境声明,可以查看下面给出的示例。这里使用了一个第三方JavaScript库的代码示例如下:
JavaScript
var TestSum;
(function (TestSum) {
var Calc = (function () {
function Calc() {
}
Calc.prototype.doSum = function (x, z) {
return x + z;
}
})
})
作为一个JS文件,我们没有时间将这个给定的库重写成typescript。但是,你确实需要添加具有类型安全的doAdd()函数,然后通过使用ambient声明,我们可以做到这一点。所以,现在我们将创建一个ambient声明文件。
Javascript
declare module TestAdd{
export class Calc {
doAdd(x:number, z:number) : number;
}
}
现在,我们将在TypeScript文件中包含这个环境声明文件(CalAdd.d.ts)。如下所示:
Main.ts
var obj = new TestAdd.Calc();
console.log("Add: " +obj.doAdd(60, 15));
现在,在控制台上使用以下命令编译并执行Main.ts文件:
$ tsc main.ts
$ node Main.js
输出: 我们将会得到以下的输出:
75
示例2: 要理解环境声明,请查看下面给出的示例。这里使用了第三方JavaScript库,代码如下:
Javascript
var TestDif;
(function (TestDif) {
var Calc = (function () {
function Calc() {
}
Calc.prototype.doDif = function (x, z) {
return x - z;
}
})
})
作为一个JS文件,我们没有时间重新编写这个给定的库成为TypeScript。但是,你确实需要添加 doSubtract() 函数来确保类型安全,然后通过使用环境声明,我们可以做到这一点。所以,现在我们将创建一个环境声明文件。
JavaScript
declare module TestDif{
export class Calc {
doSubtract(x:number, z:number) : number;
}
}
现在,我们将把这个环境声明文件包含在TypeScript文件中。以下是文件内容:
Main.ts
var obj = new TestDif.Calc();
console.log("Subtract: " + obj.doSubtract(50, 10));
现在,在控制台上使用以下命令编译和执行Main.ts文件:
$ tsc main.ts
$ node Main.js
输出: 我们将会得到下面的输出:
40
极客教程