Jor*_*phy 4 javascript namespaces class typescript difference
TypeScriptclasses
和namespaces
TypeScript之间到底有什么区别?我知道,如果您使用静态方法创建一个类,您可以在不实例化该类的情况下访问它们,这正是我猜命名空间的要点之一。
我也知道你可以创建多个同名的 Namespace 并且它们的方法在编译为 JS 时将属于同一个函数。
但是我不知道什么时候使用一个或另一个......对我来说,最后,类和命名空间几乎相同,所以我想我错过了一些东西......
你说得对。命名空间和静态类类似。它们有一些共同的特征。它们都是 ES5 模式的语法糖,具有相似之处 -参见 TypeScript Playground提供的转译 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 = {}));
Run Code Online (Sandbox Code Playgroud)
然而,它们也有自己的特点:
命名空间仅存在于 TypeScript 中,而不存在于 ECMAScript 中。它们可以被视为IIFE语法糖。它们可以嵌套(例如A.B.C
)以类似于 C# 命名空间。自 ECMAScript 6 (ES6/ES2015)以来,在大多数情况下,ES6 模块比命名空间更有趣,因为在文件级别处理嵌套并保持代码结构平坦更简单。
ES6 中也提供了包含静态成员的类。它们也是“构造函数模式”的语法糖。静态类提供与命名空间相同的功能,但语法不太常见 -请参阅前面的示例。
因此,从根本上来说,每种模式都有自己与这些用例相关的理念:
这些建议可以帮助生成更“惯用”的代码,即更易于阅读和维护。
但你/你的团队拥有你的代码,决定权在你。您可以根据您的经验尝试不同的模式来进行比较。最后,如果您选择的话,在命名空间上使用纯静态类也不错,就像使用命名空间而不是 ES6 模块一样。
但我不知道什么时候使用一个或另一个......对我来说,最后,类和命名空间几乎相同,所以我想我错过了一些东西......
当你想创建它的实例时使用类,例如
class Foo {
x = 0
}
const foo = new Foo(); // instantiate
Run Code Online (Sandbox Code Playgroud)
仅当您需要对类似的类/函数/变量等进行分组时才使用命名空间,例如
namespace Foo {
export class Bar {}
export class Bas {}
}
Run Code Online (Sandbox Code Playgroud)
最终使用语法存在重叠,例如类上的静态可以被滥用以表现得像命名空间。如果您遵循本指南,则可以忽略该重叠。
归档时间: |
|
查看次数: |
2217 次 |
最近记录: |