TypeScript 的关键字 static 有什么作用?

2024-08-26 15:51:39 593
在 TypeScript 中,`static` 关键字用于定义类的静态属性或静态方法。静态属性或方法属于类本身,而不是某个实例,因此它们可以通过类名直接访问,而无需创建类的实例。

static 关键字的主要作用

  1. 定义类级别的属性和方法:

    • 使用 static 关键字,可以在类中定义静态属性和方法。这些属性和方法可以在不创建类实例的情况下直接访问。
  2. 共享属性或方法:

    • 静态属性和方法通常用于在类的所有实例之间共享数据或行为。例如,计数器、单例模式等场景。

示例 1: 静态属性

class Counter {
    static count: number = 0;

    static increment() {
        Counter.count++;
    }

    static getCount(): number {
        return Counter.count;
    }
}

console.log(Counter.getCount()); // 输出: 0
Counter.increment();
console.log(Counter.getCount()); // 输出: 1

解释:

  • Counter 类中定义了一个静态属性 count 和两个静态方法 incrementgetCount
  • count 是一个共享的计数器,increment 方法用于增加计数,getCount 方法用于获取当前的计数值。
  • 可以直接通过类名 Counter 来访问静态属性和方法,而不需要创建类的实例。

示例 2: 静态方法

class MathHelper {
    static square(x: number): number {
        return x * x;
    }

    static cube(x: number): number {
        return x * x * x;
    }
}

console.log(MathHelper.square(3)); // 输出: 9
console.log(MathHelper.cube(3));   // 输出: 27

解释:

  • MathHelper 类定义了两个静态方法 squarecube,分别用于计算一个数的平方和立方。
  • 这些方法不依赖于任何实例,可以直接通过类名 MathHelper 调用。

静态属性与实例属性的区别

  • 静态属性属于类本身,并且在类的所有实例之间共享。
  • 实例属性属于类的某个具体实例,每个实例都有自己独立的一份实例属性。

示例 3: 静态属性与实例属性的对比

class Example {
    static staticProperty = "I am a static property";
    instanceProperty = "I am an instance property";
}

console.log(Example.staticProperty); // 输出: "I am a static property"

const example1 = new Example();
const example2 = new Example();

console.log(example1.instanceProperty); // 输出: "I am an instance property"
console.log(example2.instanceProperty); // 输出: "I am an instance property"

// 错误: 静态属性不能通过实例访问
// console.log(example1.staticProperty);

解释:

  • staticProperty 是一个静态属性,可以通过类名 Example 直接访问。
  • instanceProperty 是实例属性,每个 Example 实例都有自己独立的一份。

总结

  • static 关键字用于定义属于类本身的属性和方法,而不是类的实例。
  • 静态属性和方法可以直接通过类名访问,通常用于在类的所有实例之间共享数据或行为。