在Typescript中声明一个类类型变量

时间:2018-01-19 11:06:26

标签: class typescript object types

我无法理解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,没有赋值运算符?

2 个答案:

答案 0 :(得分:2)

目标是将Greeter类(实际函数)的引用副本放入变量greeterMaker。有了这些,你有两个变量greeterMakerGreeter来引用同一个类。因此,您可以通过

创建该类的对象
new Greeter()

new greeterMaker()

这两个陈述会做同样的事情,因为greeterMaker只是引用Greeter的另一个变量。

答案 1 :(得分:0)

(暂定)扩大@JGoodgive的评论。

值得注意的重要一点是:

  • TypeScript类型引用Greeter,如let var : Greeter;
  • Greeter的JavaScript实例类型,如var = new Greeter; typeof var;
  • JavaScript类类型变量,它体现了类构造函数本身,如var = Greeter

值得注意的是,类类型变量var = Greeter实际上是类构造函数。因此,顺便提一下,Greeter类型;因为它是 public 成员函数的类。

另一方面,根据教程,typeof Greeter应该返回Greeter。这是因为Greeter中的typeof Greeter表示类Greeter的构造函数。因为,构造函数返回类本身(作为实例),它[构造函数Greeter]确实是类类型Greeter