这里的一个简单问题是如何使用命名空间的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
上的静态属性?
由于
答案 0 :(得分:1)
在模块中,使用静态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;
假设编译器以CommonJS格式生成模块:
// File tsconfig.json
{
"compilerOptions": {
"module": "commonjs"
},
"exclude": [
"node_modules"
]
}
在浏览器中,您可以使用捆绑器或加载器。有一些配置要做。
Bundlers:
装载机: