带有静态成员的 class 和打字稿中的 namespace/module 之间的区别

Differences between a class with static members and a namespace/module in typescript

有很多关于如何以及何时使用静态 classes 以及如何在打字稿中实现真正的静态 class 的讨论。但是我还没有找到任何关于 class 和 namespace/module.

之间的区别的任何解释,只有静态成员与不可用的构造函数配对

它们如何影响全局命名空间,内存和使用有何不同?

因为在我看来和官方文档所说的那样,通过使用命名空间构造来实现静态 class 的功能会更容易。它比使用真正的 class.

代码更少,也更容易

您可以随时查看编译后的 javascript 输出以了解差异。命名空间是一个对象,它将与其他同名命名空间合并。

namespace A{
    export function b(){

    }
}

javascript 输出:

var A;
(function (A) {
    function b() {
    }
    A.b = b;
})(A || (A = {}));

一个class是函数,静态成员是函数的属性。

class A{
    public static b(){

    }
}

javascript 输出:

var A = /** @class */ (function () {
    function A() {
    }
    A.b = function () {
    };
    return A;
}());

命名空间和 class 都将在全局命名空间中占用相同的名称 "A"。从客户端的角度来看,访问静态 class 成员或命名空间内的函数没有区别:

A.b();

就我个人而言,我不使用静态 class 成员或命名空间,我总是在模块内的顶层定义函数和变量,并使用不同的模块来对不同的函数进行分组。 打字稿主页有一个很好的主题:https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.html