TypeScript类类型变量声明疑问:解析第18行代码及相关概念
关于TypeScript类类型与实例类型的疑问解答
咱们一个个来拆解你遇到的问题,把这段代码的逻辑理清楚:
问题1:第18行中的赋值运算符=的作用是什么?
这里要区分类型注解和变量赋值两个核心概念:
let greeterMaker: typeof Greeter是给变量greeterMaker加上TypeScript的类型约束,相当于给它贴了个标签:“你只能存储Greeter类本身的引用,不能存实例或者其他乱七八糟的类型”。- 后面的
= Greeter是给这个变量赋具体的值,把Greeter类的构造函数本身(也就是类的实际引用)存到greeterMaker里。
打个生活化的比方:类型注解就像给储物盒贴了“只能放苹果”的标签,而赋值就是把真正的苹果放进盒子——光有标签,盒子是空的,根本没法用。
问题2:类类型和实例类型的区别具体指什么?你猜的没错,再补充点细节!
你的猜测完全正确,我再给你把边界划得更清楚:
- 实例类型:就是
Greeter这个类型,比如代码里的let greeter1: Greeter,这个变量存的是用new Greeter()创建出来的具体实例。实例只能访问实例成员——比如greeting属性、greet()方法,根本碰不到静态成员(比如standardGreeting),因为静态成员属于类本身,不是某个实例独有的。 - 类类型:就是
typeof Greeter,它代表的是类构造函数的类型,存的是类本身的引用。拥有这个类型的变量,可以直接操作类的静态成员(比如greeterMaker.standardGreeting = "Hey there!"),还能调用构造函数创建新实例(比如new greeterMaker())。
简单总结:实例是“具体的产品”,类类型是“生产产品的工厂”——工厂能改通用参数,还能造新产品;而产品只能用自己的参数或者工厂的通用参数,没法改工厂的设置。
问题3:为何不能仅使用let greeterMaker: typeof Greeter,即省略赋值运算符?
因为在JavaScript/TypeScript里,声明变量如果不赋值,默认值是undefined。如果只写let greeterMaker: typeof Greeter,那greeterMaker的值就是undefined,你后面想执行greeterMaker.standardGreeting = "Hey there!"时,就会触发Cannot set properties of undefined的错误——undefined根本没有standardGreeting这个属性。
必须把Greeter类本身赋值给它,让greeterMaker持有类的实际引用,才能正常操作静态成员或者创建实例。
内容的提问来源于stack exchange,提问作者Mussé Redi
相关产品推荐
相关产品推荐

