为什么我们需要typeof作为接口来获取typescript中类的静态属性

时间:2019-02-14 13:03:31

标签: typescript function constructor interface

我正在学习解释构造函数的打字稿正式手册,并遇到了以下代码。

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());

它继续说明在编写时

  

let greeterMaker:typeof Greeter = Greeter;

我们可以使用typeof Greeter访问具有静态属性的实际类,因此可以编写greeterMaker.standardGreeting = "Hey there!";

我的问题是,当我对此进行测试时,我意识到无需编写typeof Greeter就可以使用let greeterMaker = Greeter;来写同样的东西

请您告诉我哪里出错了以及何时需要编写typeof关键字。

2 个答案:

答案 0 :(得分:1)

是的,是的,在这种情况下,不必写:typeof Greeter,因为当您为Greater分配值greeterMaker时,它也会为{{1 }}。所以我认为greeterMarker只是有关Typescript工作原理的解释

答案 1 :(得分:0)

在这种情况下,您无需显式使用typeof Greeter,编译器将根据分配为您推断此类型。但是,即使您未明确指定注释,typeof Greeter仍将是类型greeterMaker。我认为文档的意思是,如果您需要静态部分的类型,则该类型为typeof Greeter,而Greeter是实例的类型。

在工厂函数中可能有用的示例:

class Greeter {
  sayHi() { console.log("Hi") }
}

class AlertGreeter extends Greeter {
  sayHi() { alert("Hi") }
}

function doGreeting(cls: typeof Greeter) {
  new cls().sayHi();
}

doGreeting(Greeter);
doGreeting(AlertGreeter);