我的命名空间未定义。打字稿

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的命名空间未定义。打字稿相关的知识,希望对你有一定的参考价值。

我得到了Visual Studio Community 2015 + Node.js工具我创建了“Blank Node.js控制台应用程序”Typescript项目

我添加了一个TypeScript文件,TypeScript1.ts并放入以下内容:

module MyModule {
    export class Calculator {
        add(x: number, y: number): number {
            return x + y;
        };
        constructor() { }
    }
}

在主文件中,app.ts我把它:

/// <reference path="TypeScript1.ts" />
console.log('Hello world');
var subject: MyModule.Calculator;
subject = new MyModule.Calculator();
var result: number = subject.add(2, 3);
console.log(result);

它构建没有问题,但是当我尝试调试/运行时,它指出:

ReferenceError: MyModule is not defined
    at Object.<anonymous> (C:UsersUserDocumentsVisual Studio 2015ProjectsNodejsConsoleApp1NodejsConsoleApp1app.js:8:15)

我做错了什么?

答案

如果它包含来自app.js文件的代码,我会检查TypeScript1.ts内容。我的猜测是它没有。

您可以按如下方式运行tsc来修复它:

tsc --module commonjs --target es5 --outFile app.js TypeScript1.ts app.ts

请注意--outFile选项。

另一答案

我相信几乎没有问题(假设TypeScript 1.5+):

第一:/// <reference path="TypeScript1.ts" />

应该是:import MyModule from "./TypeScript1";

其次我相信你需要export module MyModule

或者你可以改变

   module MyModule {
       export class Calculator {
           add(x: number, y: number): number {
               return x + y;
           };
           constructor() { }
       }
   }

       export default class Calculator {
           add(x: number, y: number): number {
               return x + y;
           };
           constructor() { }
       }

然后import Calculator from "./TypeScript1";

或者也可以

       export class Calculator {
           add(x: number, y: number): number {
               return x + y;
           };
           constructor() { }
       }

然后import {Calculator} from "./TypeScript1";

分别取决于您选择的上述哪一项。

第一个创建Calculator类作为主要导出,如果计算器是您计划保留在文件中的主要内容,则有用,如果计划在文件中有多个同等重要的内容,则第二个非常有用。

此外,模块关键字通常不再使用,而是使用namespace关键字,因为模块关键字过于混乱,太多人将其与文件导入模块混淆。

另一答案

命名空间甚至没有引用工作......我使用过这样的东西......

sript1.ts

namespace A{
      class AA{
           var x:number;
           constructor(x:number){
                  this.x=x;
           }
      }
}

script2.ts

var y:A.AA = new A.AA(3);

即使文件位于项目的不同文件夹中,命名空间也可以工作。我没有引用或导入任何东西。

另一答案

它现在是2017年圣诞节,他们仍然没有解决这个问题:(。Alexanders解决方案是正确的。对于“Visual Studio Code”,请在tsconfig.json文件中使用以下内容:

"compilerOptions": {
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true,
  "module": "system",
  "outFile": "bundle.js",
  "target": "es5"
},

然后,运行捆绑文件“node bundle”。

以上是关于我的命名空间未定义。打字稿的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:引用 Vuex 存储模块会导致 VueJs 2.5 的命名空间错误

使用打字稿时出现“未捕获的 ReferenceError:未定义角度”

打字稿定义无法导入Angular2

打字稿错误:“”仅指一种类型,但在此处用作命名空间

打字稿方法返回未定义的方法装饰器

使用反应创建上下文时找不到命名空间“ctx”错误 - 打字稿