我正在学习解释构造函数的打字稿正式手册,并遇到了以下代码。
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关键字。
答案 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);