Import 对TypeScript模块感到困惑

Import 对TypeScript模块感到困惑,import,module,namespaces,typescript,Import,Module,Namespaces,Typescript,我是TypeScript新手,但有C#背景,对如何处理TypeScript模块有点困惑。我一直在考虑将模块作为C#中的名称空间,但这可能是错误的,因为我的代码没有按照我预期的方式运行 我有以下文件夹结构: |-myApp | |-myController | | |-myController.ts | |-models |-a.ts |-b.ts 该代码: // a.ts module MyApp.Models { export class

我是TypeScript新手,但有C#背景,对如何处理TypeScript模块有点困惑。我一直在考虑将模块作为C#中的名称空间,但这可能是错误的,因为我的代码没有按照我预期的方式运行

我有以下文件夹结构:

|-myApp
|  |-myController
|  |      |-myController.ts
|  |-models
       |-a.ts
       |-b.ts
该代码:

// a.ts
module MyApp.Models {
    export class A {

    }
}
// b.ts
module MyApp.Models {
    export class B {

    }
}

// myController.ts (THIS DOESN'T WORK)
module MyApp.MyController {
    import Models = MyApp.Models;
    class MyController {
        a = new Models.A();
        b = new Models.B();
    }
}

// myController.ts (THIS WORKS)
module MyApp.MyController {
    class MyController {
        a = new Models.A();
        b = new Models.B();
    }
}
在上面的示例中,我尝试导入模块(名称空间?)模型将导致运行时出错,因为模型未定义。但是,如果我删除import语句,代码将正常工作。我可能没有清晰地思考,犯了一些非常愚蠢的初学者错误,但是有人能告诉我我做错了什么,在我的特定场景中使用模块的最佳方式是什么吗。如果我删除导入但不使用它,为什么它会起作用


Typescript模块类似于C#命名空间。它们帮助组织代码库

import
语句可用于两件事:提供别名或导入外部模块

要创建别名,请按原样使用导入:

import Models = App.Models;
要导入您使用的外部模块,请执行以下操作:

import Models = './path/to/module';

我不明白你的代码为什么不起作用。我试图在我的机器上复制它,但两个控制器都为我工作。

很抱歉回答得太晚

模块/名称空间的问题和魔力出现在三个方面:

  • 你的系统-由于你的系统类型脚本编译器以不同的方式发现文件,当它将你的源代码编译成JS代码时,它会占据一席之地,因为相同的ts文件提供不同的JS结果
  • 理解神奇的语句
    //
    。如果没有AMD或System.js等额外的模块系统,则使用这个词非常重要。因为如果使用合并编译,它会发生,因为它会告诉编译器编译文件的顺序
  • 理解JS执行和TypeScript在编译的JS文件中提出的结构。只需考虑下一个例子——(是您编译成JS示例)

    由于typescript JS构建模块和类的技术,它使用了一个类似以下的函数:

    var MyApp;
        (//functon wrapping
         function (MyApp) {//function declaration 
            var MyController;
            (function (MyController_1) {
                var Models = MyApp.Models;
                var MyController = (function () {
                    function MyController() {
                        this.a = new Models.A();
                        this.b = new Models.B();
                    }
                    return MyController;
                })();
                MyController_1.MyController = MyController;
            })(MyController = MyApp.MyController || (MyApp.MyController =  {}));
    
    在这种情况下,像next一样调用会导致运行时异常,因为anonimus块以前没有执行过

      MyController(); // here runtime exception
    
      var MyController = (function () {
                    function MyController() {
                        this.a = new Models.A();
                        this.b = new Models.B();
                    }
                    return MyController;
                })();
    
    现在,回到我们的示例并发现它,正如您看到前面定义的MyController一样,匿名函数和名为MyController的变量的执行现在存在于全局范围中。 下一步是执行MyController类的构造函数,我们在其中找到下两部分代码

           this.a = new Models.A();
           this.b = new Models.B();
    
    但是这里我们得到了一个错误,因为由变量
    模块
    和类
    A
    B
    组成的匿名函数尚未执行。这就是为什么,在这一刻,我们得到了变量模块未定义的错误

  • 希望本主题能让您更好地了解JS和TS,并帮助您实现新功能

    祝你好运


    另外,你会遇到什么样的错误?(数字,文本)嗨,当我用a=新模型打电话时。a()模型是未定义的。错误类似于typeerror无法读取未定义的属性“a”你是否已将引用C添加到文件
    a
    b
    ?有时它可能会导致像这样的错误,我以前没有,但我现在这样做了,我担心同样的结果。我很感激你花时间来帮助我。正如我所说的,只要省略import语句,我就可以让它工作,但我担心我可能对如何使用typescript模块有完全错误的想法。谢谢你的回复。我也不明白为什么我的别名不能让我访问模型类。我用的是最新的ts传送机。我也开始认为,把我的模型类放在同一名称空间的不同文件中可能不是一个好主意。嗨,我仍然有问题,但我相信这与我们的gulp任务的设置方式和我们的transfile的顺序有关。你的回答很有启发性,我将接受它作为我特定问题的答案。谢谢你的努力和详细的解释。你能分享你的配置文件吗?我想我知道是什么导致了你的问题。你用了吗?我用gulp tsk时也有同样的问题,但是当我把它改成gulp字体时,一切都开始正常工作了
      MyController(); // here runtime exception
    
      var MyController = (function () {
                    function MyController() {
                        this.a = new Models.A();
                        this.b = new Models.B();
                    }
                    return MyController;
                })();
    
           this.a = new Models.A();
           this.b = new Models.B();