Javascript 什么';Typescript中这段代码的要点是什么?

Javascript 什么';Typescript中这段代码的要点是什么?,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,我正在阅读Typescript手册,我注意到代码中(对我来说)没有意义的部分。有人能解释一下这是为了什么吗 摘自: 所以,文档说,var greeterMaker:typeof Greeter=Greeter“将保存类本身。”我也不完全确定这意味着什么 然后它会这样做: greeterMaker.standardGreeting = "Hey there!"; // Which does the exact same thing as this: Greeter.standardGreetin

我正在阅读Typescript手册,我注意到代码中(对我来说)没有意义的部分。有人能解释一下这是为了什么吗

摘自:

所以,文档说,
var greeterMaker:typeof Greeter=Greeter
“将保存类本身。”我也不完全确定这意味着什么

然后它会这样做:

greeterMaker.standardGreeting = "Hey there!";

// Which does the exact same thing as this:
Greeter.standardGreeting = "Hey there!";

这里我遗漏了什么?

这是在TS的键入系统中工作,以获取类的引用,而不声明
greeterMaker
直接持有类(我想
foo:class
可能是不允许的)


从理论上讲,即使右侧的值不是
Greeter
,而是具有类似语义和相同公共静态字段的其他类,这也会起作用。它可以允许您动态地提供不同的类并使用它,但在本例中,并没有特别的帮助。

如果您运行代码,您将看到“Hello,there”应该显示在一个警报框中。接着是“嘿,你好!”

如果不创建一个新的on作为Typeof,则无法在类Greeter中更改静态变量

如果您尝试添加行 greeter.standardGreeting=“你好!”


它会出错。

这部分文档似乎试图解释
问候语类型与
问候语类型之间的区别

要理解这两件事,首先必须理解TypeScript类是一种语法糖,它结合了(1)构造函数和(2)描述该构造函数生成的实例的接口

所以,当你看到这个:

class Greeter {
    static standardGreeting = "Hello, there";
    greeting: string;
    greet() {
        // ... code ...
    }
}
实际上,您所做的是定义一个更像这样的东西:

interface Greeter {
  greet(): void;
}

var Greeter: {
  new(): Greeter;
  prototype: Greeter;
  standardGreeting: string;
};

Greeter = function () {};
Greeter.prototype.greet = function () {
  // ...code...
};
换句话说,您已经编写了一个接口
Greeter
,该接口描述了Greeter实例,并在变量
Greeter
上添加了第二个匿名类型,该变量描述了构造函数。(这是因为类型存在于一个单独的并行命名空间中,该命名空间与生成代码中的变量名不冲突。)

使用
Greeter
接口类型很明显,只需编写
Greeter
——但是如何访问附加到
Greeter
变量的匿名类型?答案是类型修饰符的
typeof
type。编写
typeof Greeter
时说“使用变量Getter的类型”,这允许我们访问分配给变量
Greeter
的匿名类型,该变量包含构造函数

这就是文档试图解释的。希望这个解释更清楚,我们现在可以理解代码的这一部分:

// This creates an alias called `greeterMaker` to the
// Greeter constructor function
// (functions are objects, and objects are always handled
// by-reference in JavaScript)
var greeterMaker: typeof Greeter = Greeter;

// This modifies the `standardGreeting` property of the
// function through the alias
greeterMaker.standardGreeting = "Hey there!";

// This invokes the constructor function through the alias,
// constructing a new instance of a Greeter
var greeter2:Greeter = new greeterMaker(); // And this line

我不认为你遗漏了什么。它们在变量中保存对类的引用。他们使用该变量来修改类。这只是间接的。在这种情况下,可以通过执行
Greeter.standardGreeting=“你好!”// This creates an alias called `greeterMaker` to the
// Greeter constructor function
// (functions are objects, and objects are always handled
// by-reference in JavaScript)
var greeterMaker: typeof Greeter = Greeter;

// This modifies the `standardGreeting` property of the
// function through the alias
greeterMaker.standardGreeting = "Hey there!";

// This invokes the constructor function through the alias,
// constructing a new instance of a Greeter
var greeter2:Greeter = new greeterMaker(); // And this line