TypeScript static 怎么用

TypeScript 是前端开发里很火的工具,它能帮我们少写 bug、更清楚代码逻辑,而 static 关键字就是它藏在类里的一个实用小功能,很多新手容易搞混它和普通属性的区别,其实用生活化的例子就能轻松搞懂。

什么是类里的「静态」?

先想个日常场景:你开了一家奶茶店,每一杯奶茶都是「奶茶」这个类的实例——每杯奶茶有自己的温度、甜度,这些是实例的属性,不同奶茶可能不一样。但店里的「店名」「营业时间」是整个奶茶店共有的,不管做多少杯奶茶,这些信息不会变。

TypeScript static 怎么用

对应到 TypeScript 里,static 就是用来标记「整个类共有,不属于单个实例」的属性或方法。普通属性是每个实例自己的,就像每杯奶茶的甜度;static 属性是类的,就像奶茶店的店名。

静态属性和普通属性的区别

举个代码例子更清楚:

`typescript

class MilkTeaShop {

// 普通属性:每个实例自己的属性

shopName: string;

temperature: number;

// 静态属性:整个类共有

static openingTime = "9:00-22:00";

constructor(name: string, temp: number) {

this.shopName = name;

this.temperature = temp;

}

}

// 创建两个奶茶实例

const milkTea1 = new MilkTeaShop("茶小甜", 65);

const milkTea2 = new MilkTea("茶甜小", 70);

`

这里 milkTea1 和 milkTea2 都有自己的 shopName 和 temperature,改其中一个的 temperature,另一个不会变;但 MilkTeaShop.openingTime 是静态属性,不管创建多少杯奶茶,它都是同一个值——要是你想改营业时间,直接改 MilkTeaShop.openingTime,所有用这个类创建的实例都会自动更新这个信息,不用一个个改实例。

要注意:静态属性不能通过实例访问,比如 milkTea1.openingTime 就会报错,必须用类本身来访问,这是新手常踩的小坑。

静态方法怎么用?

和静态属性一样,用 static 标记的方法是类的方法,不是实例的方法。还是用奶茶店的例子:普通方法是「给这杯奶茶加珍珠」,只针对单个奶茶;静态方法是「统计今天卖了多少杯奶茶」,这个数据是整个店的,属于类本身。

`typescript

class MilkTeaShop {

static salesCount = 0;

// 静态方法:统计销量

static addSale() {

this.salesCount++;

}

// 普通方法:给单个奶茶加料

addTopping(topping: string) {

console.log(给这杯奶茶加${topping});

}

}

// 卖了2杯奶茶

MilkTeaShop.addSale();

MilkTeaShop.addSale();

console.log(MilkTeaShop.salesCount); // 输出2

// 实例调用普通方法

const myTea = new MilkTeaShop("茶小甜", 60);

myTea.addTopping("珍珠"); // 正常执行

`

这里 addSale 是静态方法,用来统计整个类的销量,不能通过实例调用;而 addTopping 是普通方法,只能给单个奶茶加料。

什么时候该用 static?

不用纠结要不要用,记住一个简单原则:如果这个属性或方法和具体的单个实例无关,是整个类的公共信息,就用 static。比如:

  • 工具类里的通用方法:比如一个 StringUtils 类的 trim 方法,不管处理哪个字符串,逻辑都一样,就加 static;
  • 全局计数、配置信息:比如项目里的接口地址,是整个项目用的,就可以放在静态属性里;
  • 不需要访问实例属性的方法:比如计算两个数的平均值,不需要用到某个实例的信息,就用静态方法。

要是你把不需要用 static 的属性加了 static,会导致所有实例共用这个属性,改一个就全改,很容易出 bug;反过来,该用 static 的地方不用,每次创建实例都存一份相同的信息,还会浪费内存。

掌握了这些,TypeScript 里的 static 就不会难用,它能帮你写出更整洁、逻辑更清晰的代码。

上一篇 Java 常见垃圾回收器有哪些