首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeScript中类与命名空间的区别

TypeScript中类与命名空间的区别
EN

Stack Overflow用户
提问于 2018-01-14 17:17:59
回答 2查看 3.2K关注 0票数 6

classesnamespaces在TypeScript中到底有什么区别?我知道,如果您使用静态方法创建一个类,您就可以访问它们,而无需实例化类,我猜这正是名称空间的要点之一。

我还知道,您可以创建多个具有相同名称的名称空间,它们的方法在编译到JS时将属于同一个函数。

但是我不知道什么时候该使用一个或another...for,最后,类和名称空间几乎是一样的,所以我想我遗漏了一些东西.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-15 21:50:52

你是对的。名称空间和静态类是相似的。它们有一些共同的特征。它们都是ES5模式的语法糖,具有相似之处- cf。转接JavaScript由https://www.typescriptlang.org/play/#src=// TypeScript class C { static readonly Name = 'C'; static print() { console.log(`Name=${C.Name}`); } } namespace N { export const Name = 'N'; export function print() { console.log(`Name=${Name}`); } } // Usage C.print(); N.print(); const c = new C(); const n = new N(); // TS Error: Cannot use 'new' with an expression whose type lacks a call or a construct signature)给出

代码语言:javascript
运行
复制
// TypeScript
class C {
    static readonly Name = 'C';
    static print() {
        console.log(`Name=${C.Name}`);
    }
}

namespace N {
    export const Name = 'N';
    export function print() {
        console.log(`Name=${Name}`);
    }
}

// Usage
C.print();
N.print();
const c = new C();
const n = new N(); // TS Error: Cannot use 'new' with an expression whose type lacks a call or a construct signature

// Transpiled JavaScript
var C = /** @class */ (function () {
    function C() {
    }
    C.print = function () {
        console.log("Name=" + C.Name);
    };
    C.Name = 'C';
    return C;
}());

var N;
(function (N) {
    N.Name = 'N';
    function print() {
        console.log("Name=" + N.Name);
    }
    N.print = print;
})(N || (N = {}));

然而,他们也有自己的特点:

  • 名称空间只在TypeScript中,而在ECMAScript中。它们可以被看作是生平语法糖。它们可以嵌套(例如,A.B.C),以类似于C#名称空间。自从ECMAScript 6( ES6 /‘s 2015)以来,在大多数情况下,ES6模块比名称空间更有趣,因为在文件级别处理嵌套和保持代码结构平坦更容易。
  • (包括静态成员)也可在ES6中使用。它们也是“构造函数模式”的语法糖。静态类提供与命名空间相同的特性,但语法不那么常见-参见前面的示例。

因此,从根本上说,每种模式都有与这些用例相关的自己的哲学:

  • 对于静态(即+/-全局)成员:大多数情况下是ES6模块;有时TypeScript名称空间,甚至在模块内部--参见https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.html;或者仅仅是一个常量对象文本,
  • 要创建对象:类(顺便说一句,该类也可以具有静态成员,比如工厂方法)、工厂函数、简单的对象文本、.

这些建议可以帮助生成更“惯用”的代码,即更容易阅读和维护。

但是你/你的团队拥有你的代码,这个决定就是你的了。您可以尝试不同的模式,以比较他们根据您的经验。最后,如果这是您的选择,那么在名称空间上使用纯静态类也不错,比如使用名称空间而不是ES6模块。

票数 5
EN

Stack Overflow用户

发布于 2018-01-15 04:31:46

但是我不知道什么时候该使用一个或another...for,最后,类和名称空间几乎是一样的,所以我想我遗漏了一些东西……

当您想要创建类的实例时,可以使用类。

代码语言:javascript
运行
复制
class Foo {
 x = 0
}
const foo = new Foo(); // instantiate

仅在需要对类似的类/函数/变量等进行分组时才使用命名空间

代码语言:javascript
运行
复制
namespace Foo {
  export class Bar {}
  export class Bas {}
}

重叠

在结束用法语法上有重叠,例如类上的静态可以被滥用来表现为名称空间。如果您遵循本指南,您可以忽略这种重叠。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48252136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档