那么我想的更难,但我想出了如何使用namespace
封装我的代码
我已经知道如何使用class
(我来自C#世界)
对于这个问题,我有一个小class
只需要一个启动,然后它开始工作(不导出任何函数或属性)来完成其无限的内部工作。
有人告诉我,在我的情况下,使用class
不是一个好习惯,因为我总是只有一个不导出任何内容的实例,所以我需要使用internal module
代替..
现在我的所有代码都在namespace
内工作得很好,将它封装在class
中也是一种好习惯吗?
namespace X { class Y { } }
或者我应该在没有上课的情况下离开它?
我的模块代码是一组使用共享内部状态协同工作的函数。
一个好的答案将详细解释使用namespace
的原因,何时使用class
,何时使用两者以及何时使用没有
到目前为止,我没有找到一个解释每个问题最佳实践的页面,我相信对我这个问题的一个很好的答案会从像我这样迷茫的新人那里获得很多很好的反馈(或赞成;)。
答案 0 :(得分:2)
嗨,欢迎来到Typescript。
首先。由于我们在javascript中使用
导入代码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或汇总等捆绑器难以分析您编译的打字稿和树木抖动(通过静态分析依赖关系删除未使用的代码)。
否则,具有导出成员的命名空间和具有静态成员的类非常相似,并且将编译为几乎相同。
只需避免使用depricated模块语句,因为它与作为您导入的文件的模块含义冲突。
以下是TS playground
中示例的链接编辑:根据请求添加解释说明:
在大型模块中使用命名空间时,如果块描述对象或者您希望代码更加可优化EDIT(输入太快),您希望将功能块和类分隔开来。通常虽然名称空间通常不需要,我们从c#或java等语言中获取。在你的ex中我会(如果我理解正确的话)在一个模块中创建一个单例类(一个带有静态get实例函数和私有构造函数的类,或者如果它只有一个函数,只需将它导出到一个模块中,没有客观化或命名空间如果你想在该函数周围使用“命名空间”进行clairty导入,如下所示:
import * as MyModule from "somewhere";
MyModule.myexportedFn();