【问题标题】:How to use Existing typescript namespaced classes as external modules for nodejs如何使用现有的打字稿命名空间类作为 nodejs 的外部模块
【发布时间】:2017-01-08 05:09:13
【问题描述】:

这里的简单问题是如何使用命名空间打字稿类作为外部模块在 node.js 中使用。答案似乎是

做不到,不要尝试,不要使用命名空间

好吧,我的立场是,我们有一个大型代码库,全部编写在命名空间中,我们现在也尝试在 node.js 中使用此代码。

我正在尝试弄清楚如何使用我们现有的代码。

我已经将我的命名空间代码编译到一个 commonjs nodelibs 文件夹中,该文件夹会为每个 ts 文件生成一个 js 文件和一个 d.ts

我必须将以下内容添加到我希望节点可用的每个 ts 文件中:

namespace Organisation.Project.Entities{
    export class SomeThing{

    }
}

var module: {copy module definition from node.d.ts}

if(module)
{
    module.exports = Organisation.Project.Entities;
}

我可以在我的节点应用程序中使用此代码:

var entities = require("../nodelibs/entities/entities");

var myThing = new entities.SomeClass();

尽管../nodelibs/entities/entities 处同时存在entities.jsentities.d.ts,但没有类型信息或编译时间检查SomeClass 是否存在。

我可以手动导入引用文件并手动键入类的实例,但在我的情况下,SomeClass 是一个带有很多静态的类,所以我不知道如何正确键入它...

var entities = require("../nodelibs/entities/entities");

var classRef = entities.SomeClass;

var myVar = classRef.staticProperty;

在本例中,我不能将classRef 键入为SomeClass,因为它不是SomeClass 的实例,而是类构造函数。 如何键入 classRef 以便可以访问 Some Class 类的静态属性?

谢谢

【问题讨论】:

  • 也许用import entities 而不是var entities
  • Import 给出了各种错误,例如找不到模块或实体。js 不是有效的模块...
  • 在导入的文件entities.ts中,你应该使用标准的静态ES6语法:export namespace Organisation.Project.Entities { /* ... */ }。之后,编译器将能够将其视为有效模块。

标签: javascript node.js typescript namespaces typescript1.6


【解决方案1】:

使用 ES6 模块编写代码

在模块中,使用静态ES6 module syntax:

// File entities.ts
export namespace Organisation.Project.Entities {
    export class SomeClass {
        public static abc = 'abc';
    }
}

然后,导入您的命名空间:

// File main.ts
import {Organisation} from './entities';
type classRef = Organisation.Project.Entities.SomeClass;
var myVar = classRef.abc;

为 Node.js 编译

说编译器生成CommonJS格式的模块:

// File tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs"
    },
    "exclude": [
        "node_modules"
    ]
}

为浏览器编译

在浏览器中,您可以使用捆绑程序或加载程序。有一些配置要做。

打包者:

装载机:

【讨论】:

  • 如此接近!我认为这会解决它,但如果我将导出添加到命名空间,那么如果没有用于浏览器的模块(指定了 outFile),我将无法编译。这就是我们目前将代码库编译到一个文件中的方式。谢谢
  • @Roaders :您可以使用捆绑器 (Webpack) 或加载器 (SystemJS) 来使用浏览器。我会编辑。
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多