我来自 PHP 世界,目前正在实现我的第一个 TypeScript 项目。不幸的是,很多我在 PHP 中已经习惯了很长时间的东西在这里不起作用。其中之一是以下代码示例:
abstract class Car {
constructor() {
this.initCar()
}
abstract initCar(): void
abstract start(): void
}
class SportCar extends Car {
private engine = ''
initCar(): void {
this.engine = 'V8'
}
start() {
console.log(`I'm starting the ${this.engine} engine.`)
}
}
const sportCar = new SportCar()
sportCar.start()
我的期望是我正在启动V8引擎。将会输出。但不幸的是我正在启动引擎。将会输出。
这可以通过查看 Javascript 输出来回答:
"use strict";
class Car {
constructor() {
this.initCar();
}
}
class SportCar extends Car {
constructor() {
super(...arguments);
this.engine = '';
}
initCar() {
console.log('initCar');
this.engine = 'V8';
}
start() {
console.log(`I'm starting the ${this.engine} engine.`);
}
}
const sportCar = new SportCar();
sportCar.start();
如您所见,
this.engine = ''
行在构造函数之后执行。
我认为这也是相当令人惊讶的行为。解决这种情况的最简单方法是不将
engine
初始化为空字符串,因为毕竟......为什么会呢?你总是会覆盖它。
class SportCar extends Car {
private engine!: string;
initCar(): void {
console.log('initCar');
this.engine = 'V8';
}
start() {
console.log(`I'm starting the ${this.engine} engine.`)
}
}