Visual Studio代码抱怨它"找不到命名空间"对于* .d.ts文件

时间:2015-10-07 00:00:08

标签: angularjs typescript gulp yeoman visual-studio-code

我使用gulp-angular Yeoman生成器创建了一个新项目,语言设置为TypeScript。然后运行Gulp构建过程并在Web浏览器中打开页面,所有这些都没有任何更大的问题。我只需将ref: "master"中的tsd.json替换为ref: "1.4.1"即可使构建工作正常。基本上我执行了以下命令:

yo gulp-angular
vim tsd.json
gulp
gulp serve
code .

之后我在Visual Studio Code打开了项目。

现在,Visual Studio代码抱怨例如"找不到AngularJS数据类型的每次出现的命名空间'" 使用。它还抱怨*.d.ts文件中定义的MomentJS和其他类型。

项目的tsd.json看起来像这样:

{
  "version": "v4",
  "repo": "borisyankov/DefinitelyTyped",
  "ref": "1.4.1",
  "path": ".tmp/typings",
  "bundle": ".tmp/typings/tsd.d.ts"
}

.tmp/typings文件夹包含以下文件:

angular-ui-router/angular-ui-router.d.ts
angularjs/angular-animate.d.ts
angularjs/angular-cookies.d.ts
angularjs/angular-mocks.d.ts
angularjs/angular-resource.d.ts
angularjs/angular-sanitize.d.ts
angularjs/angular.d.ts
jquery/jquery.d.ts
moment/moment-node.d.ts
moment/moment.d.ts
toastr/toastr.d.ts
tsd.d.ts

举例说明Visual Studio Code抱怨的其中一个源文件,这里是navbar.directive.ts文件:

module editorTs {
  'use strict';

  /** @ngInject */
  export function acmeNavbar(): ng.IDirective {

    return {
      restrict: 'E',
      scope: {
        creationDate: '='
      },
      templateUrl: 'app/components/navbar/navbar.html',
      controller: NavbarController,
      controllerAs: 'vm',
      bindToController: true
    };

  }

  /** @ngInject */
  class NavbarController {
    public relativeDate: string;

    constructor(moment: moment.MomentStatic) {
      this.relativeDate = moment(1444135396045).fromNow();
    }
  }
}

在此文件中,Visual Studio代码抱怨{em}"无法找到名称空间''" 的ng.IDirective类型抱怨" moment.MomentStatic类型无法找到命名空间''"

修改

通过在navbar.directive.ts的顶部添加以下内容来明确引用类型定义文件,可以解决问题:

/// <reference path="../../../../.tmp/typings/angularjs/angular.d.ts"/>
/// <reference path="../../../../.tmp/typings/moment/moment.d.ts"/>

但是.tmp/tsd.d.ts中已经引用了这些文件,其中包含以下内容:

/// <reference path="angular-ui-router/angular-ui-router.d.ts" />
/// <reference path="angularjs/angular-animate.d.ts" />
/// <reference path="angularjs/angular-cookies.d.ts" />
/// <reference path="angularjs/angular-mocks.d.ts" />
/// <reference path="angularjs/angular-resource.d.ts" />
/// <reference path="angularjs/angular-sanitize.d.ts" />
/// <reference path="angularjs/angular.d.ts" />
/// <reference path="jquery/jquery.d.ts" />
/// <reference path="moment/moment-node.d.ts" />
/// <reference path="moment/moment.d.ts" />
/// <reference path="toastr/toastr.d.ts" />

那么应该没有必要明确引用这些文件吗?

4 个答案:

答案 0 :(得分:1)

  

找不到命名空间&#39; ng&#39;&#34;

确保项目不包含对declare module ng的引用。同样的。

更新

基于问题中的编辑:

  

通过在navbar.directive.ts的顶部添加以下内容来显式引用类型定义文件,可以解决问题

请使用tsconfig.jsonhttps://basarat.gitbooks.io/typescript/content/docs/project/compilation-context.html

答案 1 :(得分:1)

tsconfig.json添加到我的VS Code项目的根目录是解决这个问题的原因。此外,不得不重新启动VS代码。这是我放在该文件中的内容:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "sourceMap": true
    }
}

有关tsconfig.json文件的详细信息,请查看:

https://code.visualstudio.com/docs/languages/typescript

答案 2 :(得分:1)

我在代码中的谨慎位置找到了以下内容。可能放在那里以避免类型错误。似乎vscode遇到了这种情况,并将全局'angular'变量重新定义为'any'的类型。

var angular = window['angular'];

答案 3 :(得分:0)

我有同样的问题;看来打字机正在剥离引用“ng”导入的原始定义文件。

将其添加回原始的angular / index.d.ts文件:

// Collapse angular into ng import ng = angular;

或者更好的是,将它放在ng.d.ts文件中,这样它就不会被打字覆盖了。