【发布时间】: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.js 和entities.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