声明 var 导致未定义错误

gin*_*boy 5 typescript durandal

我是一个打字稿新手,我正在选择一个现有的 durandal 项目来进行一些更改。我注意到这个代码片段给出了一个运行时错误。

declare var routeLinks: IRouteLinks;
routeLinks = new RouteLinks();
export = routeLinks;
Run Code Online (Sandbox Code Playgroud)

错误 = Failed to load root module (ui/shell). Details: routeLinks is not defined(…)

但是,当我更改代码以删除declare关键字(如下)时,问题就消失了,代码似乎按预期工作。

var routeLinks: IRouteLinks;
routeLinks = new RouteLinks();
export = routeLinks;
Run Code Online (Sandbox Code Playgroud)

这种模式在很多地方被复制,每次我遇到运行时异常时,我都会进入并删除declare关键字并解决问题。

  • 谁能解释为什么包含declare关键字会导致这个问题,为什么删除它可以解决这个问题?
  • declare在这种情况下首先使用 的可能意图是什么(如果可能,用新手术语)?
  • 如果此代码以前有效,那么我的盒子怎么会失败?(打字稿或 durandal 版本之间的重大变化可能?)

谢谢。

更多信息

进一步研究这一点,当我比较编译的 js 时,我发现当我们使用declare关键字时缺少这一行

 var routeLinks;
Run Code Online (Sandbox Code Playgroud)

所以这个错误现在对我来说更有意义,但是为什么 usingdeclare会导致交叉编译器删除变量声明,这似乎违反直觉。

Nit*_*mer 7

declare关键字背后的想法是告诉编译器,当代码加载到环境中时,将在运行时出现一个变量(或类、函数等)。
例如,当使用没有声明文件的库时,这很有用。

例如,以下代码:

declare var VERSION: string;
console.log(`loaded version: ${VERSION}`);
Run Code Online (Sandbox Code Playgroud)

编译为:

console.log("loaded version: " + VERSION);
Run Code Online (Sandbox Code Playgroud)

虽然这个:

var VERSION: string;
console.log(`loaded version: ${VERSION}`);
Run Code Online (Sandbox Code Playgroud)

编译成:

var VERSION;
console.log("loaded version: " + VERSION);
Run Code Online (Sandbox Code Playgroud)

使用declare关键字时,编译器将忽略它,不会将其输出到生成的 js。

在您的情况下,变量可能未在运行时定义,这就是为什么在删除declare.

您可以在此处阅读更多相关信息:快速提示 – TypeScript 声明关键字