【问题标题】:When do you use declare in TypeScript?你什么时候在 TypeScript 中使用声明?
【发布时间】:2019-12-12 15:09:52
【问题描述】:
在 TypeScript 中,为什么有时需要使用 declare 来声明变量,而有时却不需要(同样的问题也适用于函数,...)?
举个例子:我什么时候(以及为什么)使用
declare var foo: number;
如果
let foo: number;
会做同样的事情(至少在我看来好像它做的一样,即他们都声明了一个名为foo 的变量number)。有什么区别?
【问题讨论】:
标签:
javascript
typescript
【解决方案1】:
你从不使用declare 来声明一个变量。您只需使用它来让 TypeScript 知道该变量存在,即使它没有在代码中声明(例如,因为它是在其他代码中声明的全局变量,或者因为您要将 tsc 的 JavaScript 输出与另一个声明变量的文件)。或者换一种说法:它只为 TypeScript 编译器声明它,而不是为 JavaScript 运行时声明。
如果您使用 Playground 编译您的 declare var foo: number;,它实际上不会为该声明输出任何内容; example.
相比之下,let foo: number;(或var foo: number;)是变量声明; example.
【解决方案3】:
在 TypeScript 中,“declare var foo: number;”的意思是:“代码中有一个名为 foo 的数字。我知道你不会检索它。但请相信我,并像你知道的那样行事。 em>" 是一种前向声明,就像你在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" -->
因此,没有必要在您的 TS 脚本中包含 jQuery,因为从您的 TS 脚本生成的 JS 将了解有关 jQuery 的所有内容。但是,TS 转译器会在您的代码中多次标注 jQuery 的标志性“$()”。您没有在 TS 代码中包含 jQuery(因为没有必要),因此它对“$()”一无所知。因此,它会向您报告很多错误,询问您在代码中随处可见的“$”到底是什么。要解决所有与$ 相关的错误,您将在 TS 脚本的开头写上“declare var $: jQuery;”。通过写这个,你告诉 TS 转译器:
在代码中有一个名为“$”的变量,其类型为“jQuery”。我知道你不会找回它。但是假设它存在并且请表现得像在代码的前面有一个“import "aTSfile.ts";”完美地向您描述了它(就像我使用它一样的描述)。相信我,JavaScript 会在脚本执行时知道“$”REALLY 是什么。不用担心那个。 ;-)