【问题标题】:Typescript Internal Module Across Multiple Files In NodejsNodejs中跨多个文件的Typescript内部模块
【发布时间】:2015-09-11 12:38:14
【问题描述】:

我一直在翻阅 StackOverflow 帖子和多篇博文,但似乎找不到答案。

我正在使用 VS Code、nodejs、typescript 和 gulp。 当我将所有模块控制器代码放入一个文件时,如下所示:

 <controllers.ts>
 module Controllers {
    export class Api {
         get(controllerName:string):IController {
         }
    }   
 }

 module Controllers {
    export interface IController {
        performAction(actionName:string):any;
    }
 }

 module Controllers {
    export class ControllerBase implements IController {
        performAction(actionName:string):any {
    }
  }
}

module Controllers {
    export class UserController extends ControllerBase {
    }
}

export = Controllers;

Gulp 能够编译它并且 nodejs 正确运行它。

不过,当我把它分成多个文件时,我似乎无法编译它:

<controllers.ts>
module Controllers {
    export class Api {
         get(controllerName:string):IController {
         }
    }   
}

module Controllers {
    export interface IController {
        performAction(actionName:string):any;
    }
}

module Controllers {
    export class ControllerBase implements IController {
        performAction(actionName:string):any {
        }
    }
}

export = Controllers;

<UserController.ts>
module Controllers {
    export class UserController extends ControllerBase {
    }
}

我试过添加

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

到我的 UserController.ts 文件的顶部。当我这样做时,它仍然找不到 ControllerBase。

我试过了

export class Controllers.UserController extends Controllers.ControllerBase

它不喜欢 UserController 之前的控制器,但如果我删除那个控制器并让它看起来像这样:

export class UserController extends Controllers.ControllerBase

那么显然它将 UserController 放在不同的模块中。

另外,像这样导入它:

import Controllers = require("./controllers");

似乎也没有帮助。我不确定还能尝试什么。任何帮助将不胜感激。这似乎不应该实现。

【问题讨论】:

    标签: node.js typescript gulp visual-studio-code


    【解决方案1】:

    在做这样的事情时,似乎有两个问题。

    1. Intellisense 在您选择的编码工具中和
    2. 编译。

    对于我的场景,智能感知不是问题,因为对于扩展基类的类,我不需要对基类中的函数进行智能感知。编译是我最大的挣扎。这是我想出的解决方案。我不喜欢它,但它似乎确实有效。

    var gulp = require('gulp');
    var concat = require('gulp-concat');
    var insert = require('gulp-insert');
    var ts = require('gulp-typescript');
    var del = require('del');
    
    var tsOptions = {
        noImplicitAny: true,
        target: 'ES5',
        module: 'commonjs'
    };
    
    gulp.task('clean', function(done) {
        del(['./dest'], done);
    })
    
    gulp.task('compile-controllers', function() {
        return gulp.src(['./src/controllers.ts', './src/*.ts'])
                   .pipe(concat('controllers.ts'))
                   .pipe(insert.append('export = Controllers;'))
                   .pipe(ts(tsOptions))
                   .js
                   .pipe(gulp.dest('dest/server'));
    });
    

    【讨论】:

      【解决方案2】:

      Nodejs 中跨多个文件的 Typescript 内部模块

      不要。将external modules 与编译器标志--module commonjs 一起使用:https://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

      如果您仍然不相信这里还有更多原因:https://github.com/TypeStrong/atom-typescript/blob/master/docs/out.md

      【讨论】:

      • 感谢您的回复。我看了您的视频并阅读了您的帖子,但仍然不知道如何实现我想要的。我想定义一个可变/未知数量的控制器,它们都可以扩展 ControllerBase。我希望它们存在于单独的文件中以允许小型集中文件,但它们都存在于同一个模块('namespace')下。这是可以实现的吗?从您的帖子看来, --out 将是我必须采取的方法,但不建议这样做,因为您不能保证构建顺序,这可能会导致很多问题。有没有办法解决这个问题?
      猜你喜欢
      • 2012-09-29
      • 2013-09-25
      • 2013-12-10
      • 1970-01-01
      • 2015-07-15
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      相关资源
      最近更新 更多