我无法理解TypeScript tutorial的以下片段的第18行。
1 class Greeter {
2 static standardGreeting = "Hello, there";
3 greeting: string;
4 greet() {
5 if (this.greeting) {
6 return "Hello, " + this.greeting;
7 }
8 else {
9 return Greeter.standardGreeting;
10 }
11 }
12 }
13
14 let greeter1: Greeter;
15 greeter1 = new Greeter();
16 console.log(greeter1.greet());
17
18 let greeterMaker: typeof Greeter = Greeter;
19 greeterMaker.standardGreeting = "Hey there!";
20
21 let greeter2: Greeter = new greeterMaker();
22 console.log(greeter2.greet());
正如我从教程中理解的那样,greatermaker
声明的目标是将Greeter类类型转换为变量,而不是实例类型。
首先,这一行中赋值运算符=
的功能是什么?
其次,我们对类类型和实例类型的区别究竟是什么意思? 我想,在第一个我们能够操纵静态成员变量而不是第二个?
修改
为什么我们不使用let greeterMaker: typeof Greeter
,没有赋值运算符?
答案 0 :(得分:2)
目标是将Greeter
类(实际函数)的引用副本放入变量greeterMaker
。有了这些,你有两个变量greeterMaker
和Greeter
来引用同一个类。因此,您可以通过
new Greeter()
或
new greeterMaker()
这两个陈述会做同样的事情,因为greeterMaker
只是引用Greeter
的另一个变量。
答案 1 :(得分:0)
(暂定)扩大@JGoodgive的评论。
值得注意的重要一点是:
Greeter
,如let var : Greeter
; Greeter
的JavaScript实例类型,如var = new Greeter; typeof var;
var = Greeter
。值得注意的是,类类型变量var = Greeter
实际上是类构造函数。因此,顺便提一下,Greeter
类型;因为它是 public 成员函数的类。
另一方面,根据教程,typeof Greeter
应该返回Greeter
。这是因为Greeter
中的typeof Greeter
表示类Greeter
的构造函数。因为,构造函数返回类本身(作为实例),它[构造函数Greeter
]确实是类类型Greeter
。