如何使用现有的typescript命名空间类作为nodejs的外部模块

时间:2016-08-31 14:34:34

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

这里的一个简单问题是如何使用命名空间的typescript类作为在节点中使用的外部模块。答案似乎是

  

无法完成,请勿尝试,不要使用命名空间

嗯,我的位置是我们有一个大的代码库,都是用命名空间编写的,我们现在也尝试在node.js中使用这个代码。

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

我已将命名空间代码编译到commonjs nodelibs文件夹中,该文件夹为每个js文件生成一个d.ts文件和一个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();

尽管在entities.js同时存在entities.d.ts../nodelibs/entities/entities,但没有类型信息或编译时检查SomeClass是一件事。

我可以手动导入引用文件并手动输入类的实例,但在我的情况下SomeClass是一个有很多静态的类,所以我无法弄清楚如何正确输入它。 ..

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

var classRef = entities.SomeClass;

var myVar = classRef.staticProperty;

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

由于

1 个答案:

答案 0 :(得分: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"
    ]
}

编译浏览器

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

Bundlers:

装载机: