如何解决ESLint的no-inner-declarations报错且无需将module改为class?
解决方案
有两种无需改为类的方案可以解决该报错:
方案1:调整ESLint规则配置(最推荐,无需修改业务代码)
你遇到的no-inner-declarations报错属于ESLint核心规则对TypeScript特有语法的兼容问题:核心规则无法识别TS的module/namespace块的特殊作用域属性,会将其判定为普通块级作用域,因此把块内的函数声明识别为非法的块内声明。
你可以按如下步骤修改配置:
- 关闭ESLint核心的
no-inner-declarations规则 - 启用
@typescript-eslint插件提供的@typescript-eslint/no-inner-declarations规则,该规则对TS语法做了适配,不会对namespace/module块内的合法声明误报
对应.eslintrc配置参考:
{ "rules": { "no-inner-declarations": "off", "@typescript-eslint/no-inner-declarations": "error" } }
方案2:调整代码写法,将内部函数声明改为函数表达式
如果不方便修改ESLint配置,可以将模块内的私有函数从函数声明写法改为函数表达式赋值,no-inner-declarations规则只会拦截函数/变量声明语句,不会拦截赋值操作:
export module Foo { const foos = [] export function getFoos() { return getLastFoo(); } // 改为箭头函数表达式,规避声明检测 const getLastFoo = () => { return foos[-1] } }
额外提示:export module是TypeScript的旧版语法,更推荐替换为语义更明确的export namespace Foo写法,可以减少部分工具的语法识别异常。
内容的提问来源于stack exchange,提问作者Meron
相关产品推荐
相关产品推荐

