多模块复用TypeScript接口的ESLint兼容导出方式咨询
别头疼啦,我来帮你理清这个接口导出和ESLint规则冲突的问题,分两步解决:
1. 首选方案:用命名导出(更符合TS社区习惯)
其实在TypeScript里,复用类型的时候,命名导出是更常用也更稳妥的写法,既能避免语法歧义,还能完美适配ESLint规则。直接这么写就行:
// typings/sys.ts export interface Sys { contentType: { sys: { id: string }; }; id: string; }
之后在其他模块里导入的话,就用:
import { Sys } from '../typings/sys';
这种写法基本不会触发ESLint的语法错误,只要你的ESLint配置正确识别了TypeScript语法就行。
2. 要是你偏好默认导出:修正写法+解决规则冲突
如果你习惯用默认导出,别直接把interface跟在export default后面(虽然TS能编译,但ESLint会揪着分号的问题不放),改成先定义接口再导出的写法:
// typings/sys.ts interface Sys { contentType: { sys: { id: string }; }; id: string; } export default Sys;
接下来解决你遇到的两个ESLint错误:
针对"'Sys' is not defined"错误
这个问题是因为ESLint原生的no-undef规则不认识TypeScript的类型定义,你需要用TypeScript专属的规则来替代它。打开你的ESLint配置文件(比如.eslintrc.js),修改规则:
module.exports = { // ...其他配置项 rules: { "no-undef": "off", // 关掉原生规则 "@typescript-eslint/no-undef": "error" // 启用TS版的未定义检查 } };
针对分号冲突的问题
一会儿说缺分号一会儿说多了分号,这说明你的ESLint同时启用了互相矛盾的分号规则(比如原生semi和@typescript-eslint/semi冲突)。统一用TS专属的分号规则就行:
module.exports = { // ...其他配置项 rules: { "semi": "off", // 关掉原生的分号规则 "@typescript-eslint/semi": ["error", "always"] // 这里选"always"(强制加)或"never"(强制不加),看你的编码习惯 } };
要是你用了Prettier配合ESLint,记得安装eslint-config-prettier和eslint-plugin-prettier,然后在ESLint配置的extends里加上"plugin:prettier/recommended",让ESLint跟着Prettier的格式化规则走,就不会再出现这种分号矛盾的问题啦。
最后总结一下
优先选命名导出的方式写可复用接口,省心又规范。要是遇到ESLint规则冲突,核心就是:用@typescript-eslint/*系列的规则替代原生ESLint规则,同时统一格式化相关的配置(比如分号、引号这些)。
内容的提问来源于stack exchange,提问作者CaribouCode

