【问题标题】:Typescript cannot find name even though it is referenced即使引用了 Typescript 也找不到名称
【发布时间】:2018-11-15 03:09:25
【问题描述】:

我有一个我正在用打字稿写的 Angular 项目。这在 VS 下对我来说效果很好,现在我在 webstorm 下尝试使用 Node.JS。

我有一个progressor 类,在progressor.ts 文件中:

export class Progressor{
    public tasks: any;

    constructor(){
        this.tasks = {};
    }
    ...
}

我有我的主控制器,它使用这个类:

/// <reference path="../progressor.ts" />

declare var angular: any; // I'm trying to eliminate these...
declare var Papa: any;
declare var $: any;

class MainController{
    constructor($scope: any){
        $scope.progressor = null;
        $scope.filesDropped = function(files, rejectedFiles){
            if(!files || !files.length)
                return;

            $scope.progressor = new Progressor();
            // ...
        }
    };
}

请注意,这不是 Node.JS 代码 - 它只是 Node.JS 项目的一部分。

相对参考路径正确。当我尝试使用以下方法编译它时:

tsc mainController.ts --module amd --target es5

我收到一个错误:找不到名称 Progressor。

我不明白问题出在哪里...到目前为止,我的 Node.JS 项目一直遇到麻烦,我正在考虑为这个项目完全放弃 TS。首先 - 谁能告诉我为什么它不能编译?请注意,我希望每个 TS 文件都单独编译,这样我就可以通过 Chrome 轻松地调试它们。

【问题讨论】:

标签: typescript


【解决方案1】:

如果你 exported 了一些东西,你需要 import 它才能使用它,而不是 &lt;reference ... 它。

&lt;reference 注释替换为import prog = require('./progressor');,然后您可以使用例如new prog.Progressor().

您可以考虑使用export = Progressor,以便从另一个文件中导出的对象是类本身而不是容器。

【讨论】:

  • 这行得通!非常感谢!但我不明白,为什么 不好?那和'import require'有什么区别?不记得在VS下用TS的时候用过...
  • 我收回了 - 现在的代码似乎对 requirejs 或 commonjs 有依赖(我不确定),这是我不想要的,我很确定我没有拥有...
【解决方案2】:

经过一段时间的搜索,我偶然发现了这个:TypeScript Modules。咨询后,我尝试将我的两个类都放在 module{ } 块中,从而解决了问题。对于为什么该语言会要求我将模块用于多文件使用,我仍然有点困惑......但现在它会做。

【讨论】:

  • 如果你不使用 requirejs 或 commonjs 模块,你可以把你的类放在顶层(即不在模块内),而不是把 export 关键字放在它们上面,一切都会工作如你所愿。
  • 这不正是原帖中描述的情况吗?
  • 这个问题是矛盾的/令人困惑的是你是否真的是 nodejs 作为一个模块加载器。
  • 该项目使用node.js作为服务器端,但这个具体的例子是在浏览器上运行的客户端代码(角度)
  • 在这种情况下,您不应该使用顶级 export 关键字(除非您使用 requirejs)
猜你喜欢
  • 2019-06-20
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多