TypeScript:命名空间与类

标签 typescript module namespaces class-design

嗯,这比我想象的要难,但我想出了如何使用 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/

相关文章:

c# - Parent - C# 中的 CChild 管理

python - 安装 Python 库后自动创建奇怪的文件

php - 在 PHP 中使用与包含

javascript - 未处理的 promise 拒绝 : Cannot call method 'push' of null

reactjs - TypeScript - React 上下文不适用于新的 PropTypes 包

typescript - Webpack 无法找到 TypeScript(显然)找到的导入

python - 如何更新已安装的模块路径?奥多

ruby-on-rails - rails : Where is the best place to put rspec files for modules in lib directory?

python - 让 App Engine 模块工作

html - 如何根据链接是外部链接还是内部链接在Vue中动态呈现<router-link>或<a>?