typeof expression 用来饭回表达式结果的类型字面量。

typeof instance 返回的是类型字面量

  1. typeof 123 // number
  2. typeof 'foo' //string
  3. typeof {} // object

typeof class 返回的是构造器方法

class Greeter {
    static standardGreeting = "Hello, there";
    greeting: string;
    greet() {
        if (this.greeting) {
            return "Hello, " + this.greeting;
        }
        else {
            return Greeter.standardGreeting;
        }
    }
}

let greeter1: Greeter;
greeter1 = new Greeter();
console.log(greeter1.greet());

let greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";

let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());

声明变量时使用typeof

class Foo{
  static bar = 'im a static property';
  baz: string;
}
let foo: Foo = new Foo() // A 种写法
let foo: typeof Foo = Foo // B 种写法

A 写法:foo 作为Foo的实例,包含了 Foo的非静态属性和方法
B 写法:foo 作为Foo的构造器方法,包含了Foo的静态属性和方法。可以理解为 类型的类型,也即是 foo是Foo的类型

把类当作接口使用

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};

如上一节里所讲的,类定义会创建两个东西:类的实例类型和一个构造函数。 因为类可以创建出类型,所以你能够在允许使用接口的地方使用类。

参考

TypeScript Handbook: class static side example overcomplication
TypeScript中 typeof 的含义