【问题标题】:declaring var results in undefined error声明 var 导致未定义的错误
【发布时间】:2016-11-23 13:36:30
【问题描述】:

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

declare var routeLinks: IRouteLinks;
routeLinks = new RouteLinks();
export = routeLinks;

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

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

var routeLinks: IRouteLinks;
routeLinks = new RouteLinks();
export = routeLinks;

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

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

谢谢。

更多信息

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

 var routeLinks;

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

【问题讨论】:

  • 这是运行时错误吧?不是汇编?
  • 是的,运行时错误。
  • declare 表示变量routeLinks 已经在其他地方定义,并且应该在加载此代码sn-p 之前将其加载到环境中。当您删除 declare 时,它实际上将变量声明输出到已编译的 js。我不确定您是如何加载内容的,因此很难更具体地回答。
  • 这正是我需要的答案,所以你知道,把它放在一个答案中,并获得一些很棒的分数!

标签: typescript durandal


【解决方案1】:

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

例如下面的代码:

declare var VERSION: string;
console.log(`loaded version: ${VERSION}`);

编译为:

console.log("loaded version: " + VERSION);

此时:

var VERSION: string;
console.log(`loaded version: ${VERSION}`);

编译成:

var VERSION;
console.log("loaded version: " + VERSION);

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

在您的情况下,变量可能未在运行时定义,这就是为什么您在删除 declare 时不会收到错误消息。

您可以在此处阅读更多信息:Quick Tip – TypeScript Declare Keyword

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2019-12-04
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2021-10-04
    • 2011-02-28
    • 2013-06-06
    • 2021-10-27
    相关资源
    最近更新 更多