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:类和实例成员的区别
实例成员需要通过类的实例来访问和使用个,每一个实例都有自己独立的一份实例成员数据
静态成员直接属于类本身,无需创建类的实例,可以直接通过类名来调用它,不需要实例化