Yit*_*hak 7 class-design namespaces module typescript
好吧,那时我想更难,但我想出了如何使用 namespace
我已经知道如何使用class
(我来自 C# 世界)
对于这个问题,我有一个小程序class
,它只需要启动,然后它就开始工作(不导出任何函数或属性)以完成其无限的内部工作。
有人告诉我,在我的情况下,使用 a 不是一个好习惯class
,因为我总是只有一个不导出任何内容的实例,所以我需要使用internal module
...
现在我的所有代码都在namespace
a 中运行良好,将它class
也封装在 a 中是否是一个好习惯?
namespace X { class Y { } }
Run Code Online (Sandbox Code Playgroud)
或者我应该不上课就离开它?
我的模块代码是一堆使用共享内部状态协同工作的函数。
一个很好的答案将详细解释何时使用 a namespace
、何时使用 a class
、何时使用两者以及何时不使用任何原因。
直到现在,我还没有找到解释每个人的最佳实践的页面,我相信对我的问题的一个很好的答案会从像我这样困惑的新人那里得到很多很好的反馈(或赞成;))。
嗨,欢迎来到打字稿。
第一的。由于我们在 javascript 土地导入代码中使用
import { some_exported_thing } from "./path/to/file_without_ending";
Run Code Online (Sandbox Code Playgroud)
每个文件都是一个模块,这意味着您应该避免在类中使用命名空间。导入为您处理第一个命名空间层:
import { Y as less_general_name } from "my_module";
Run Code Online (Sandbox Code Playgroud)
否则你很快就会得到这样的结果:
import * as X from "my_module";
console.log(X.X.Y);
Run Code Online (Sandbox Code Playgroud)
此外,它使诸如 webpack 或 rollup 之类的打包器难以分析您编译的打字稿和 treeshake(通过依赖项的静态分析删除未使用的代码)。
否则,具有导出成员的命名空间和具有静态成员的类非常相似,并且将编译为几乎相同。
避免使用废弃的 module 语句,因为它与作为您导入的文件的模块的含义相冲突。
这是 TS游乐场中示例的链接
编辑:根据要求从评论中添加解释:
在大型模块中,当您希望在功能块和类块描述对象时或当您希望代码更可优化编辑时(输入太快)将功能块和类分开,请使用命名空间。通常,虽然命名空间通常不需要,但我们从 c# 或 java 等语言中带走了一些东西。在你的前任中,我会(如果我理解正确的话)在一个模块中创建一个单例类(一个带有静态 get 实例函数和私有构造函数的类,或者如果它只有 1 个函数,只需将它导出到一个模块中,没有对象化或命名空间. 如果您想在该函数周围使用“命名空间”进行清晰的导入,如下所示:
import * as MyModule from "somewhere";
MyModule.myexportedFn();
Run Code Online (Sandbox Code Playgroud)