TypeScript中给原型添加方法时能否让this获得正确类型?
TypeScript 原型扩展方法this类型丢失解决方案
给已有的TS类通过模块声明合并扩展原型方法时,方法内部this无法自动推导为目标类类型的问题,不需要给内部变量额外声明类型,使用TS原生的this类型参数即可解决,没有任何运行时代码冗余。
正确实现代码
declare module "./MyClass" { interface MyClass { myNewMethod(): void; } } MyClass.prototype.myNewMethod = function(this: MyClass) { let foo = this; // 此处foo会自动推导为MyClass类型,无需额外标注类型 // 正常编写方法内部逻辑即可 }
原理说明
- 这里写在函数参数第一位的
this: MyClass是TypeScript提供的特殊语法,属于类型层面的虚拟参数,编译为JavaScript时会被完全擦除,不会产生任何额外运行时代码 - 显式声明该函数执行时的
this上下文类型后,TS会自动对函数内部所有this的引用做正确类型推导,赋值给内部变量时也会自动继承类型,不需要再单独给内部变量加类型标注 - 不要用箭头函数写原型方法,箭头函数的
this是词法作用域绑定,挂载到原型上时会丢失实例上下文的指向,反而会引发运行时逻辑错误
注意:如果你的TS配置开启了
strict: true或者noImplicitThis: true,未显式标注this类型的原型方法本身就会抛出类型错误,加上这个虚拟参数也能同时消除该类报错。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

