gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:12:43 24 4
gpt4 key购买 nike

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

It can't be done, don't try it, don't use namespaces

嗯,我的情况是,我们有一个大型代码库,全部都是在命名空间中编写的,我们现在也尝试在 Node.js 中使用此代码。

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

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

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

namespace Organisation.Project.Entities{
export class SomeThing{

}
}

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

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

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

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

var myThing = new entities.SomeClass();

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

我可以手动导入引用文件并手动键入类的实例,但在我的例子中 SomeClass是一个包含很多静态内容的类,所以我不知道如何正确输入它......

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

var classRef = entities.SomeClass;

var myVar = classRef.staticProperty;

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

谢谢

最佳答案

使用 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"
]
}

为浏览器编译

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

bundler :

装载机:

关于javascript - 如何使用现有的 typescript 命名空间类作为 Nodejs 的外部模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com