你什么时候在 TypeScript 中使用声明?

Gol*_*den 2 javascript typescript

在 TypeScript 中,为什么有时需要使用declare来声明变量,有时不需要(同样的问题对于函数也是如此,......)?

举个例子:我什么时候(以及为什么)使用

declare var foo: number;
Run Code Online (Sandbox Code Playgroud)

如果

let foo: number;
Run Code Online (Sandbox Code Playgroud)

会做同样的事情(至少在我看来好像它做了同样的事情,即它们都声明了一个名为footype的变量number)。有什么不同?

T.J*_*der 5

你永远不会declare用来声明一个变量。你只是用它让 TypeScript 知道变量存在,即使它没有在代码中声明(例如,因为它是在其他代码中声明的全局变量,或者因为你要将 JavaScript 输出tsc与另一个文件组合声明变量)。或者换句话说:它只为 TypeScript 编译器声明它,而不是为 JavaScript 运行时声明。

如果您使用 Playground 编译您的declare var foo: number;,它实际上不会为该声明输出任何内容;例子

相反,let foo: number;(or var foo: number;)一个变量声明;例子


air*_*dex 5

在 TypeScript 中,“ declare var foo: number;”的意思是:“代码中有一个叫做 foo 的数字。我知道你不会检索到它。但是请相信我,就像你知道它一样。 ”这是一种前向声明,就像你一样在C/C++中可以看到。

例子:

假设您正在使用 jQuery 编写 TS 脚本。您可以在 HTML 页面中的某个位置包含所有这样的 JavaScript:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="myscript.js"></script> <!-- generated from TypeScript, with something like "tsc myscript.ts" -->
Run Code Online (Sandbox Code Playgroud)

因此,不需要在 TS 脚本中包含 jQuery,因为从 TS 脚本生成的 JS 将了解有关 jQuery 的所有内容。然而,TS 转译器会$()在代码中多次注释 jQuery 的标志性“ ”。您没有在 TS 代码中包含 jQuery(因为没有必要),因此它不知道有关“ $()”的任何信息。$因此,它会向您报告许多错误,询问您代码中随处可见的“”到底是什么。要解决所有这些$相关错误,您将declare var $: jQuery;在 TS 脚本的开头写入“”。通过编写此内容,您可以将以下内容告诉 TS 转译器:

代码中有一个名为“ $”的变量,其类型为“ jQuery”。我知道你不会取回它。但假设它存在,请表现得就像import "aTSfile.ts";代码前面有一个“”完美地向您描述了它(就像我使用它一样的描述)。相信我,当脚本执行时, JavaScript 会知道“ $到底是什么。不用担心那个。;-)