TypeScript中noUnusedLocals在generator函数中失效及私有参数误报问题
解决TypeScript中
noUnusedLocals/noUnusedParameters对类私有属性误报未使用的问题 嘿,这个问题我之前也踩过坑!其实是TypeScript的静态类型检查器对普通函数和箭头函数的this绑定处理逻辑不一样导致的。
问题原因分析
你定义watchSaga用的是普通生成器函数:
watchSaga = function* watchSaga() { yield takeEvery(ACTION_TYPE.SOME_ACTION, this.someSaga, this.someService); };
普通函数的this是动态绑定的,在代码静态分析阶段,TypeScript没法确定这个this一定指向AllReduxSagas的实例。所以它识别不出this.someService其实是在引用类里声明的someService属性,就会误报“Property 'someService' is declared but its value is never read”。
几种有效的解决办法
1. 改用箭头函数生成器
箭头函数会进行词法绑定,this会直接指向类实例,TypeScript能清晰追踪到属性的使用:
export class AllReduxSagas { constructor(private someService: SomeService) {} watchSaga = function* () { yield takeEvery(ACTION_TYPE.SOME_ACTION, this.someSaga, this.someService); }; // ...其他方法 }
2. 提前保存this的引用
在普通函数里先把类实例的this存到一个变量里,让TypeScript能追踪到属性的引用:
export class AllReduxSagas { constructor(private someService: SomeService) {} watchSaga = function* watchSaga() { const self = this; yield takeEvery(ACTION_TYPE.SOME_ACTION, self.someSaga, self.someService); }; // ...其他方法 }
3. 显式指定this的类型
给生成器函数添加this参数注解,明确告诉TypeScript函数内的this指向当前类实例:
export class AllReduxSagas { constructor(private someService: SomeService) {} watchSaga = function* watchSaga(this: AllReduxSagas) { yield takeEvery(ACTION_TYPE.SOME_ACTION, this.someSaga, this.someService); }; // ...其他方法 }
这三种方法都能让TypeScript正确识别someService的使用,消除误报的编译错误。
内容的提问来源于stack exchange,提问作者Mois
相关产品推荐
相关产品推荐

