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

为什么我们需要typeof作为接口来获取typescript中类的静态属性,typescript,function,constructor,interface,Typescript,Function,Constructor,Interface,我正在学习解释构造函数函数的typescript官方手册,并遇到了以下代码 class Greeter { static standardGreeting = "Hello, there"; greeting: string; greet() { if (this.greeting) { return "Hello, " + this.greeting; } else { re

我正在学习解释构造函数函数的typescript官方手册,并遇到了以下代码

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 Greeter
访问具有静态属性的实际类,因此可以编写
greeterMaker.standardGreeting=“嘿,这里!”

我的问题是,当我测试这一点时,我意识到同样的事情不需要编写
typeof Greeter
就可以了,只需要
let greeterMaker=Greeter一个人可以写
greeterMaker.standardGreeting=“嘿,你好!”


请告诉我哪里出错了,什么时候我需要写关键字的类型。

是的,你说得对,在这种情况下,写
:问候者的类型是不必要的,因为当你为
greeterMaker
分配值
更大时,它也为
greeterMarker
分配类型。所以我认为
:typeof Greeter
只是一个关于Typescript如何工作的解释

在这种情况下,您不需要显式地使用
typeof Greeter
,编译器将根据赋值为您推断此类型。但是,即使您没有明确指定注释,
typeof Greeter
仍将是类型
greeterMaker
。我认为文档的要点是,如果您需要静态部分的类型,那么类型是
typeofgreeter
,而
Greeter
是实例的类型

这可能有用的一个示例是在factory函数中:

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

谢谢一个简单的问题。是类AlertGreeter typeof Greeter,因为它具有相同的函数名。如果它的方法被称为其他方法,它还会是typeof吗Greeter@JoeStarbright
AlertGreeter
扩展了
Greeter
,因此它与
Greeter
兼容,而且它们都有一个空构造函数