嗯,这比我想象的要难,但我想出了如何使用 namespace
封装我的代码
我已经知道如何使用类
(我来自 C# 世界)
对于这个问题,我有一个小的类
,它只需要启动,然后它就开始工作(不导出任何函数或属性)以完成其无限的内部工作。
我被告知在我的情况下使用类
不是一个好习惯,因为我总是只有一个不导出任何东西的实例所以我需要使用内部模块
而不是...
现在我的所有代码都在 namespace
中运行良好,将它封装在 class
中也是一个好习惯吗?
namespace X { class Y { } }
还是我应该让它不上课?
我的模块代码是一堆使用共享内部状态协同工作的函数。
一个很好的答案会详细解释什么时候使用namespace
,什么时候使用class
,什么时候使用both,以及何时使用nothing。
直到现在我还没有找到解释每个最佳实践的页面,我相信对我的问题的一个很好的回答会从像我这样困惑的新来者那里得到很多很好的反馈(或赞成票;)。
最佳答案
您好,欢迎使用 Typescript。
首先。由于我们在 javascript 中使用 land import code
import { some_exported_thing } from "./path/to/file_without_ending";
每个文件都是一个模块,这意味着您应该避免在您的类中使用命名空间。导入为您处理第一个命名空间层:
import { Y as less_general_name } from "my_module";
否则你很快就会得到这样的结果:
import * as X from "my_module";
console.log(X.X.Y);
此外,它还使 webpack 或 rollup 等打包器难以分析您编译的 typescript 和 treeshake(通过依赖项的静态分析删除未使用的代码)。
否则,具有导出成员的命名空间和具有静态成员的类非常相似,并且将编译成几乎相同的结果。
只要避免 depricated module 语句,因为它与模块作为您导入的文件的含义冲突。
这是 TS playground 中示例的链接
编辑:根据要求添加评论中的解释:
当在大型模块中您想要分隔功能 block 和类时,当 block 描述一个对象时,或者当您只是希望您的代码更可优化时,请使用命名空间编辑(输入太快)。通常,虽然命名空间通常不需要,但我们从 c# 或 java 等语言中获取了一些东西。在你的前任中,我会(如果我理解正确的话)在一个模块中创建一个单例类(一个具有静态获取实例函数和私有(private)构造函数的类,或者如果它只有一个函数,只需将它导出到一个模块中,没有对象化或命名空间. 如果你想在该函数周围使用“命名空间”以便像这样清晰地导入:
import * as MyModule from "somewhere";
MyModule.myexportedFn();
关于TypeScript:命名空间与类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307071/