MST

星途 面试题库

面试题:TypeScript static 关键字在继承体系中的使用及原理

假设有一个父类 A 含有静态方法和静态属性,子类 B 继承自 A。请详细说明子类 B 对父类 A 中静态成员的访问规则,以及如何在子类 B 中重写父类 A 的静态方法。给出完整的 TypeScript 代码示例,并解释其中涉及的原理。
28.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

访问规则

  1. 静态属性:子类可以通过 类名.静态属性 的方式访问父类的静态属性,因为静态属性属于类本身,而不是类的实例。例如,在 B 子类中,可以通过 A.静态属性名 访问父类 A 的静态属性。
  2. 静态方法:子类同样可以通过 类名.静态方法名 的方式调用父类的静态方法,即 A.静态方法名()

重写静态方法

在 TypeScript 中,静态方法不能像实例方法那样被直接重写。虽然语法上可以在子类中定义与父类相同签名的静态方法,但这并不是真正意义上的重写。因为静态方法属于类本身,而不是实例,不同类的静态方法是相互独立的。

代码示例

class A {
    // 静态属性
    static staticProperty: string = '父类静态属性';
    // 静态方法
    static staticMethod(): void {
        console.log('父类静态方法');
    }
}

class B extends A {
    // 尝试 “重写” 静态方法
    static staticMethod(): void {
        console.log('子类 “重写” 的静态方法');
    }
}

// 访问父类静态属性
console.log(A.staticProperty); 
// 调用父类静态方法
A.staticMethod(); 

// 访问子类 “重写” 的静态方法
console.log(B.staticProperty); 
B.staticMethod(); 

原理解释

  1. 静态成员属于类:静态属性和静态方法是与类本身关联,而不是与类的实例关联。所以,无论是父类还是子类,它们访问静态成员都是通过类名进行。
  2. “重写” 的假象:在上述代码中,子类 B 定义了与父类 A 相同签名的静态方法 staticMethod。但这两个方法是相互独立的,分别属于 A 类和 B 类。当通过 A.staticMethod() 调用时,执行的是父类的方法;通过 B.staticMethod() 调用时,执行的是子类定义的方法。这与实例方法的重写概念不同,实例方法重写是基于对象的多态性,根据对象的实际类型来决定执行哪个重写版本的方法,而静态方法不具备这种基于实例的多态特性。