typescript 为什么我不能在类型脚本类的构造函数中访问抽象属性

wydwbb8l  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(130)
abstract class Route {
    abstract readonly name?: string;
    protected abstract pattern: string;

    public constructor() {
        // Do something with `this.name` and `this.pattern`.
        
        console.log(this.pattern); // Typecheck error
    }
    
    abstract handle(): void;
}

这会抛出一个错误,因为this.pattern不能在构造函数中访问。为什么我不能访问它?

klsxnrf1

klsxnrf11#

(将我的评论转换为答案)
为什么我不能访问它?
因为派生类的构造函数不会被调用,所以对象可能处于无效状态。一些语言允许父构造函数but it’s still generally agreed to be a bad practice的虚拟调用。TypeScript选择不允许它。
文档中提到了这一点:https://www.typescriptlang.org/docs/handbook/classes.html
[...]每个包含构造函数的派生类都必须调用super(),它将执行基类的构造函数。更重要的是,在我们访问构造函数体中this的属性之前,我们必须调用super()。这是TypeScript将强制执行的重要规则。
在这种情况下的解决方案是将pattern作为参数传递给Route的构造函数。如果pattern在调用父构造函数之前不能由子类的构造函数确定,那么你需要重新考虑你的设计。

abstract class Route {
    
    constructor(
        private readonly pattern: string
    )
    {
        console.log( pattern );
    }
}

class Derived123 extends Route {
    
    constructor() {
        super( /*pattern:*/ "123" )
    }
}

class Derived456 extends Route {
    
    constructor() {
        super( /*pattern:*/ "456" )
    }
}

相关问题