何时在 TypeScript 中使用类与模块?

Posted

技术标签:

【中文标题】何时在 TypeScript 中使用类与模块?【英文标题】:When to use Classes vs Modules in TypeScript? 【发布时间】:2012-10-26 15:35:14 【问题描述】:

我正在将一个大型代码库迁移到 Typescript,但想很好地掌握我应该在何时何地使用某些东西。

现在我在模块中有一些大型命名空间:

(function (nameSpace) 

    var privateVariables = '';

    function privateFunctions ()          

    // Public methods
    nameSpace.someMethodHere = function ()  ;

(window.nameSpace = window.nameSpace || ));

我的问题是在 TypeScript 中,我只是将这些变成类有什么区别/好处吗?还是应该只是一个包含类(每个方法)的大模块?

module nameSpace 

    export class someMethodHere 
       // etc
    

    // more classes (my methods) here ??

-或-

class nameSpace 

    someMethodHere () 
        // code
    
    // more prototyped methods here
   

或者我应该以我目前拥有的相同模块方式设置它们吗?我正在尝试,但它一直给我错误,不知道我如何在没有类的模块中执行nameSpace.someMethodHere

【问题讨论】:

【参考方案1】: 考虑使用模块作为Singleton(一个可随处可访问的静态对象)的一个不错的选择,其中常见的用途是库。 当您需要创建此类的多个实例或计划扩展此类时,请考虑使用一个类。

基本上,模块适合将所有代码打包到一个方便的全局对象中,而类则可以智能地构建代码和数据表示。

[EDIT] The "internal modules" have been renamed "namespaces" 此外,当您可以导入模块时,不鼓励使用命名空间。命名空间可以是部分的(即在许多文件中描述),虽然这有时很有用,但这种方法过于全局,无法被编译器正确优化。 Read more here

【讨论】:

这应该是公认的答案,因为它为单例和模块提供了明确的指导【参考方案2】:

这取决于。一个模块应该是一组离散的“事物”,而不仅仅是杂乱无章的不同类的集合,所以如果事物看起来像是属于一起的,请使用模块将它们分组。

我相信 TypeScript 团队在发布指南之前正在等待看看人们如何使用该语言,但我想人们会在他们当前发布脚本的地方发布一个模块 - 所以 jQuery 将是一个模块,每个 jQuery 插件将是一个模块,一个测试框架就是一个模块,而一个 AOP 框架就是一个模块——例如。

【讨论】:

同意,好吧,它们都是相互关联的。我想现在我想起来了,我想知道......将所有内容都放在一个类(所有方法都被原型化)或一个模块中是否更有意义?我确实喜欢模块至少不必实例化 作为基线,如果您要拥有多个实例以及与每个实例关联的数据,那么class 是您的最佳选择。如果您只是将逻辑连接的无状态函数集组合在一起,module 更合适。 我 100% 同意 @RyanCavanaugh 的观点。 太棒了!在实现所有这些时,我肯定必须考虑哪些东西是无状态的。目前仍在升级/连接大量代码(许多具有不同风格的开发人员),然后才大刀阔斧地转向 Typescript。不过很兴奋。 当我想要一个单例时,我一直在类和模块上来回切换。该模块使得以单例方式公开通用特性变得更加容易,这类似于我们在 javascript 中使用模块和 IIFE 所获得的。这个类有很多额外的特性,但是很难创建私有成员。我目前在我的 TypeScript 课程中同时使用这两种技术,它们各有利弊。但目前我认为模块技术可能更符合我的个人喜好。

以上是关于何时在 TypeScript 中使用类与模块?的主要内容,如果未能解决你的问题,请参考以下文章

何时使用静态类与实例化类

TypeScript - 何时使用目标版本?

何时使用TypeScript:常见场景的详细介绍

关于何时在 TypeScript 中调用装饰器的困惑

typescript - 4.es5与typescript的类与继承

TypeScript 类与同名接口之间的关系