TypeScript:命名空间与 Class

TypeScript: Namespace vs Class

嗯,这比我想象的要难,但我想出了如何使用 namespace

封装我的代码

我已经知道如何使用 class(我来自 C# 世界)

对于这个问题,我有一个小的 class,它只需要启动,然后它就开始工作(不导出任何函数或 属性)以完成其无限的内部工作。

有人告诉我,在我的情况下,使用 class 不是一个好的做法,因为我总是只有一个不导出任何内容的实例,所以我需要使用 internal module ...

现在我的所有代码都在 namespace 中运行良好,将它封装在 class 中也是一个好习惯吗?

namespace X { class Y { } }

或者我应该不带 class 吗?

我的模块代码是一堆使用共享内部状态协同工作的函数。

一个很好的答案会详细解释何时使用 namespace、何时使用 class、何时使用 both 以及什么时候使用 nothing.

直到现在我还没有找到解释每个最佳实践的页面,我相信对我的问题的一个很好的回答会从困惑的新来者那里得到很多很好的反馈(或赞成票;))我。

您好,欢迎使用 Typescript。

首先。由于我们在 java 脚本中使用

导入代码
import { some_exported_thing } from "./path/to/file_without_ending";

每个文件都是一个模块,这意味着您应该避免在您的 classes 中命名空间。导入为您处理第一个命名空间层:

import { Y as less_general_name } from "my_module";

否则你很快就会得到类似这样的结果:

import * as X from "my_module";
console.log(X.X.Y);

此外,webpack 或 rollup 等打包器也很难分析您编译的 typescript 和 treeshake(通过依赖项的静态分析删除未使用的代码)。

否则,具有导出成员的命名空间和具有静态成员的 class 非常相似,并且将编译成几乎相同的结果。

避免使用 depricated module 语句,因为它与模块作为导入文件的含义相冲突。

这里是 link TS playground

中的示例

编辑:根据要求添加评论中的解释:

当在大型模块中您想要分隔功能块时使用命名空间,当块描述一个对象或当您只是希望代码更可优化时使用名称空间 class 编辑(输入太快)。通常,虽然命名空间通常不需要,但我们从 c# 或 java 等语言中获取了一些东西。在你的前任中,我会(如果我理解正确的话)在模块中创建一个单例 class(一个带有静态获取实例函数和私有构造函数的 class,或者如果它只有 1 个函数,则将其导出在模块中,没有对象化或命名空间。如果你想 "namespace" 围绕该函数进行透明导入,如下所示:

import * as MyModule from "somewhere";
MyModule.myexportedFn();