【问题标题】:my namespace is not defined. Typescript我的命名空间没有定义。打字稿
【发布时间】:2016-03-08 11:38:05
【问题描述】:

我得到了 Visual Studio Community 2015 + Node.js 工具 我创建了“空白 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:\Users\User\Documents\Visual Studio 2015\Projects\NodejsConsoleApp1\NodejsConsoleApp1\app.js:8:15)

我做错了什么?

【问题讨论】:

标签: node.js visual-studio namespaces typescript


【解决方案1】:

现在是 2017 年圣诞节,他们还没有解决这个问题 >:(。 亚历山大的解决方案是正确的。对于“Visual Studio Code”,在您的 tsconfig.json 文件中使用以下内容:

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

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

【讨论】:

    【解决方案2】:

    命名空间无需引用即可工作... 我用过这样的东西...

    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);
    

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

    【讨论】:

      【解决方案3】:

      我相信问题很少(假设 TypeScript 1.5+):

      第一:/// &lt;reference path="TypeScript1.ts" /&gt;

      应该是: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 类作为主要导出,如果计算器是您计划保留在文件中的主要内容,则该类很有用,如果您计划在文件中包含多个同等重要的内容,则第二个很有用。

      此外,模块关键字通常不再使用命名空间关键字,因为模块关键字太混乱,太多人将其与文件导入模块混淆。

      【讨论】:

      • 您好 MBeatty,感谢您的回复。我已经编辑了 TypeScript1.ts: export class Calculator { add(x: number, y: number): number { return x + y; }; constructor() { } } 和 app.ts:从 "TypeScript1.ts" console.log('Hello world') 导入计算器; var 主题:MyModule.Calculator;主题 = new MyModule.Calculator(); var 结果: number = subject.add(2, 3);控制台.log(结果); Visual Studio 下划线“TypeScript1.ts”并声明“找不到模块 'TypeScript1.ts'。”。 App1 和 TypeScript1 都位于同一个文件夹中。
      • 有两件事值得尝试:从 import 语句中删除“.ts”扩展名和/或在其前面加上“./”,下次我靠近我的时候我会尝试一下TypeScript 开发设置,但如果你打败我,把它贴在这里,我会确保适当地编辑答案。
      • 是的,看起来添加“./”应该可以解决它。您可以打开或关闭“.ts”。惯例是不考虑它。所以约定是 import Calculator from "TypesScript1";
      • 另外,它不会导致错误,但切换到直接导出 Calculator 类时,您需要摆脱 MyModule。在 app.ts 中的计算器之前。这不是导致您的问题的原因,但它会导致您的下一个问题
      • 您好 MBeatty,感谢您的回答。你也使用 Visual Studio 吗?我检查了import Calculator from ".\TypeScript1";,它指出“找不到模块'.TypeScript1',尽管它位于同一个文件夹中。你需要摆脱 MyModule - 你能解释更多吗?
      【解决方案4】:

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

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

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

      请注意--outFile 选项。

      【讨论】:

      • 感谢马丁的回答。 app.js 不包含它。实际上,我不需要运行这个文件,我尝试用 Mocha 测试 TypeScript1.ts 文件并得到了同样的错误。为什么我的 app.js 不包含来自 TypeScript1 的代码?
      • 嗯,这是因为 TS 编译器假定您使用内部模块,在这种情况下,///&lt;reference ...&gt; cmets 仅用于从.ts 文件中正确排序脚本,该文件由--outFile 参数指定.或者,您可以根据需要使用import 模块的外部模块。 (有用资源typescriptlang.org/Handbook#modules-splitting-across-files
      • 谢谢,我在发问题之前阅读了这篇文章,虽然我不能完全理解它是很尴尬的。对我来说是内部的还是外部的?所有文件都在单个项目中。如何实现 Mocha 测试自动正确构建以测试 TypeScript1.ts?
      • 嗯,没有一个答案。但是,当我读到它时,如果您使用 mocha,似乎外部模块会更好。我会尝试这种方法jonnyreeves.co.uk/2015/hello-typescript-and-mocha
      • 我找到了在 Visual Studio 中将所有文件加入单个文件的方法。您必须转到项目设置,打开“TypeScript Build”选项卡并指定“Combine JavaScript output info file:”选项才能进行调试。
      猜你喜欢
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2017-11-13
      相关资源
      最近更新 更多