TypeScript this 类型怎么用

如果你刚接触 JavaScript 不久,可能会在函数调用时遇到一个让人头疼的问题:this 的指向。同样的一个函数,放在不同的对象里调用,this 指向的内容可能完全不一样,甚至在嵌套函数里会突然指向全局对象,让新手摸不着头脑。而 TypeScript 作为 JavaScript 的超集,给 this 的使用加了一层规则,学会合理控制 TypeScript 里 this 的类型,就能少踩很多坑。

先搞懂:TypeScript 里的 this 到底是什么?

很多人以为 this 是 JavaScript 的特殊变量,其实在 TypeScript 里,this 还能被标注类型。简单说,TypeScript 会检查你函数里的 this 是不是符合你预期的类型,如果不符合就会报错,相当于给 this 加了个“身份验证”。

TypeScript this 类型怎么用

举个生活化的例子:你开了一家奶茶店,this 就像店里的“店长”,你明确说“这个店长必须是奶茶店的”,如果有人硬把咖啡店的店长塞过来,TypeScript 就会提醒你不对。

最常用的场景:给函数的 this 标注类型

很多新手会在对象方法里写 this,但不小心把方法单独拿出来调用,就会出错。比如你写了一个点餐函数:

`typescript

const milkTeaShop = {

name: "小甜茶",

order(drink: string) {

console.log(顾客点了${drink},来自${this.name});

}

};

`

如果直接调用 milkTeaShop.order("珍珠奶茶"),没问题,this 指向 milkTeaShop,能拿到 name。但如果你把方法单独拿出来:

`typescript

const order = milkTeaShop.order;

order("柠檬茶"); // 这里会报错!

`

这时候 this 指向的是全局对象(浏览器里是 window),没有 name 属性,TypeScript 就会报错。怎么解决?给 this 加标注:

`typescript

interface MilkTeaShop {

name: string;

order(this: MilkTeaShop, drink: string): void;

}

const milkTeaShop: MilkTeaShop = {

name: "小甜茶",

order(drink) {

console.log(顾客点了${drink},来自${this.name});

}

};

`

现在 TypeScript 就会检查:调用 order 时,this 是不是 MilkTeaShop 类型,如果不是就提示错误,从根源上避免 this 指向混乱。

进阶用法:嵌套函数的 this 不“乱跑”

如果在对象方法里嵌套了普通函数,this 很容易“跑丢”。比如你想加一个统计订单的功能:

`typescript

const milkTeaShop = {

name: "小甜茶",

orderCount: 0,

placeOrder(drink: string) {

// 这里的this是milkTeaShop

setTimeout(function() {

// 这个function的this指向setTimeout的全局环境,不是milkTeaShop

this.orderCount++; // 报错!this上没有orderCount

console.log(${drink}下单成功,总订单数:${this.orderCount});

}, 1000);

}

};

`

以前新手会用 const self = this 来存 this,现在用 TypeScript 的 this 标注能更清晰解决:

`typescript

placeOrder(drink: string) {

setTimeout(function(this: MilkTeaShop) {

this.orderCount++; // 现在TypeScript知道this是MilkTeaShop,不会报错

console.log(${drink}下单成功,总订单数:${this.orderCount});

}, 1000);

}

`

相当于给嵌套函数的 this 也明确了身份,不用再偷偷存变量了。

还有个小技巧:用箭头函数固定 this

如果不想给每个函数都加 this 标注,用箭头函数更省事。箭头函数的 this 是继承外层的,相当于“绑定固定店长”,不会变。比如把上面的嵌套函数改成箭头函数:

`typescript

placeOrder(drink: string) {

setTimeout(() => {

this.orderCount++; // 这里的this继承自placeOrder的this,也就是milkTeaShop,不会错

console.log(${drink}下单成功,总订单数:${this.orderCount});

}, 1000);

}

`

就像你让兼职店员直接跟着店长走,不用再单独指定店长是谁,适合简单的嵌套场景。

其实 TypeScript 控制 this 类型,本质是帮你提前发现“this 认错人”的问题,就像奶茶店明确规定店长只能管店里的事,不能随便去隔壁咖啡店当店长,写代码时少了这种莫名其妙的报错,效率会高很多。

上一篇 Swift编程语言核心特性与实用开发场景知识科普