如何在TypeScript中禁用this关键字?类中能否隐式访问成员?
1. 能不能禁用TypeScript中的this关键字?
首先明确:TypeScript本身没有官方提供直接禁用this的配置项。而且从语言设计逻辑来说,this是JavaScript/TypeScript面向对象编程、函数上下文绑定的核心部分,强行禁用会彻底打乱类、对象方法的正常工作逻辑,实用性极低。
不过如果真的有特殊场景需求(比如团队强制规范),可以借助ESLint的规则来限制this的使用:
- 用
no-this规则禁止任何代码中使用this - 用
no-invalid-this规则禁止在非类/对象方法的上下文里使用this
但必须提醒:这样做会导致类的实例方法完全无法访问自身的属性和方法,基本等于废掉了TS的面向对象能力,非常不推荐。
2. 有没有办法取消类中使用this的必要性?
很遗憾,TypeScript目前不支持像C#那样隐式访问类实例成员的特性,必须显式通过this.来访问类的属性和方法。
为什么TS不做这个特性?因为TS是JavaScript的超集,必须兼容JS的作用域规则:JS里变量会优先在当前函数/块级作用域查找,找不到才会向上级作用域查找。如果TS引入隐式this,会和JS的作用域规则冲突——比如如果类方法里有一个和实例成员同名的局部变量,TS就无法判断你到底想访问哪一个。
针对你提到的报错:
[ts] Cannot find name 'vartest'. Did you mean the instance member 'this.vartest'?
这是TS的类型检查器在帮你排查问题:它在当前作用域找不到vartest这个变量,所以提示你是不是要访问实例的vartest属性。目前没有官方配置能让TS自动把未定义的变量解析为this的成员,强行hack(比如自定义lint规则)反而会引入更多潜在问题。
替代方案:减少this.的书写
虽然不能隐式访问,但可以用一些小技巧减少this.的重复书写:
- 解构实例属性:在方法开头把需要的属性解构出来,之后直接使用变量名
class Test { vartest: string = "hello"; print() { const { vartest } = this; console.log(vartest); // 不用写this.vartest } } - 使用类的getter:如果某个属性经常被访问,可以定义getter来简化(本质还是依赖
this,但能简化长属性名的书写)class Test { private _longPropertyName: string = "hello"; get shortName() { return this._longPropertyName; } print() { console.log(this.shortName); // 比写完整属性名更简洁 } }
内容的提问来源于stack exchange,提问作者ChristianB

