TypeScript派生类成员未初始化:构造函数中如何正确访问?
问题分析与解决方案
这个问题的核心是TypeScript中类字段的初始化顺序导致的——你在父类构造函数里访问this.model时,子类的声明式字段还没完成初始化。
为什么会输出undefined?
TypeScript/JavaScript中派生类的执行流程是这样的:
- 进入子类构造函数
- 首先调用
super()(父类构造函数) - 父类构造函数执行完毕后,才会初始化子类的实例字段(也就是你写的
model = 'Dodge'这一步)
所以当父类构造函数里打印this.model时,子类的model还没被赋值,自然输出undefined。
正确的实现方式
最合理的解决办法是通过构造函数参数把model传递给父类,让父类在构造函数里直接赋值并使用,这样就能保证父类构造函数执行时拿到正确的值:
abstract class Car { model: string; constructor(model: string) { this.model = model; console.log(`Car model: ${this.model}`); } } class Dodge extends Car { constructor() { // 把子类的model值传递给父类构造函数 super('Dodge'); } } const dodge = new Dodge(); // 输出: Car model: Dodge
如果你不想修改父类的构造函数参数,另一种方式是父类延迟使用model(比如在构造函数之后的方法里访问),但这种场景下显然传参的方式更符合逻辑,因为父类本身依赖model字段,应该在实例化时就确保它被初始化。
内容的提问来源于stack exchange,提问作者fbjorn
相关产品推荐
相关产品推荐

