TypeScript this 类型怎么用
如果你刚接触 JavaScript 不久,可能会在函数调用时遇到一个让人头疼的问题:this 的指向。同样的一个函数,放在不同的对象里调用,this 指向的内容可能完全不一样,甚至在嵌套函数里会突然指向全局对象,让新手摸不着头脑。而 TypeScript 作为 JavaScript 的超集,给 this 的使用加了一层规则,学会合理控制 TypeScript 里 this 的类型,就能少踩很多坑。
先搞懂:TypeScript 里的 this 到底是什么?
很多人以为 this 是 JavaScript 的特殊变量,其实在 TypeScript 里,this 还能被标注类型。简单说,TypeScript 会检查你函数里的 this 是不是符合你预期的类型,如果不符合就会报错,相当于给 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 认错人”的问题,就像奶茶店明确规定店长只能管店里的事,不能随便去隔壁咖啡店当店长,写代码时少了这种莫名其妙的报错,效率会高很多。