TypeScript static 关键字的作用

文章类型:TypeScript

发布者:hp

发布时间:2025-03-15

一:作用

1:static 是 TypeScript 中用于声明‌类级别成员‌的关键字,其修饰的属性和方法直接属于类本身,而非类的实例 ‌‌

2:通过 static 定义的成员可通过类名直接访问,无需实例化对象,适用于存储类级别的共享数据或工具方法

二:使用

1:静态变量(属性)

内存分配上=>静态变量在类加载时分配内存,整个类生命周期内仅存在一份拷贝,所有实例共享该值

访问方式上=>通过 类名.属性名 直接访问(推荐),也可通过实例访问

class MathUtils {
  static PI: number = 3.14;  
}
console.log(MathUtils.PI); // 3.14 

2:静态方法

独立性上=>静态方法与实例无关,无法通过 this 访问实例属性和方法,仅能操作静态成员

工具函数场景上=>适用于无需实例状态的操作

class Greeter {
  static greet(): void {
    console.log("Hello!");
  }

  sayHi(): void {
    console.log("Hi!");
  }
}

Greeter.greet(); // 输出 "Hello!"

// Greeter.sayHi(); // 错误: 无法在静态上下文中访问实例方法

3:静态块

初始化逻辑=>静态块用于在类加载时执行初始化代码,只会在类加载时执行一次

class Config {
  static API_URL: string;  
  static {
    this.API_URL = process.env.API_URL || "default-url";  
  }
}

4:静态成员在继承中的表现:会被子类继承,但不能通过super关键字访问,子类可以通过类名直接访问父类的静态成员

class Parent {
  static parentStaticProperty = "I am static";

  static greet() {
    console.log("Hello from Parent");
  }
}

class Child extends Parent {}

console.log(Child.parentStaticProperty); // 输出 "I am static"
Child.greet(); // 输出 "Hello from Parent"

三:规则

1:静态成员间互访:可直接访问其他静态属性和方法,静态方法‌不可访问实例成员‌(需通过实例对象间接操作)

class MathHelper {  
  static PI = 3.14;  
  static calculateArea(radius: number) {  
    return MathHelper.PI * radius * radius; // 直接访问静态属性 ‌
  }  
}  
console.log(MathHelper.calculateArea(5)); // 78.5  

//错误访问
class User {  
  name: string;  
  static defaultName = "Guest";  

  static printName() {  
    console.log(this.name); // 报错!静态方法无法访问实例属性 ‌ 
  }  
}  
//正确访问

static printName(user: User) {  
  console.log(user.name); // 通过实例参数访问 ‌
}  


2:实例成员访问静态成员:可通过 类名.属性名 或 this.constructor.属性名 访问静态成员

class AppConfig {  
  static env = "production";  

  showEnv() {  
    console.log(AppConfig.env); // 实例方法访问静态属性 ‌  
  }  
}  
const app = new AppConfig();  
app.showEnv(); // "production"  

四:与其他修饰符对比

1:static 控制成员的归属层级(类级别)

2: private/protected 控制成员的访问权限

class Logger {
  private static instance: Logger;  
  static getInstance(): Logger {  
    if (!this.instance) this.instance = new Logger();  
    return this.instance;  
  }
}

五:总结

1:共享数据‌:类级别的常量或配置

2:工具方法‌:与实例无关的纯函数

3:单例模式‌:通过私有静态属性和方法实现单例

六:拓展

1:类和实例成员的区别

实例成员需要通过类的实例来访问和使用个,每一个实例都有自己独立的一份实例成员数据

静态成员直接属于类本身,无需创建类的实例,可以直接通过类名来调用它,不需要实例化