使用 babel eslint 解析的 Typescript 转换
Typescript casting with babel eslint parsing
在将 ESLint 引入现有的 Typescript 代码库后,我遇到了一些解析错误。
我已经修复了大部分 lint 错误,但是 babel-eslint
作为解析器会抛出很多这样的错误:
23:32 error Parsing error: Unexpected token, expected ","
21 | return state.set(
22 | 'callsInProgress',
> 23 | (state.callsInProgress as any).filter(i => i !== action.payload)
| ^
24 | );
25 | }
26 | case actions.API_RESET: {
我认为这是因为 babel
不理解类型转换 as any
。
我如何通过解析器得到它?
我的babel配置如下:
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'],
plugins: ['@babel/plugin-proposal-class-properties', '@babel/plugin-transform-runtime', '@babel/plugin-transform-typescript']
};
我有一个项目正在使用 babel、eslint 和 typescript。
我建议您停止使用 eslint-babel
并改用 @typescript-eslint
/
typescript-eslint 是由 Tslint (现已弃用) 的开发人员启动的项目。它完美地检查打字稿代码。
这是我的 eslint 安装的 npm 包的示例:
"@typescript-eslint/eslint-plugin": "^2.34.0",
"@typescript-eslint/parser": "^2.34.0",
"eslint": "^5.16.0",
"eslint-plugin-import": "^2.21.2",
"eslint-plugin-jsx-a11y": "^6.3.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-react": "^7.20.0",
我的例子 .eslintrc
:
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
'eslint-plugin-node',
],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
parserOptions: {
"ecmaVersion": 2020
},
rules: {
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "always-multiline",
}],
},
env: {
es6: true,
browser: true,
node: true,
},
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: __dirname,
},
globals: {
"global": false,
"Promise": false,
},
};
注意:我不知道 eslint-babel
是否可以与 @typescript-eslint
兼容,也许可以,您可以同时使用两者。
在经历了从 JavaScript 到 TypeScript 的升级后,我终于同意接受的答案。
Post 这个答案提供了一些额外的关键点。
- @babel/eslint-parser(之前的babel-eslint)可以解析TS,让ESLint在TS上工作。
@babel/eslint-parser is a parser that allows ESLint to run on source
code that is transformed by Babel.
- @babel/eslint-parser 不能也将无法检查 TypeScript 的类型问题
since @typescript-eslint uses TypeScript under the hood, its rules can
be made type-aware, which is something Babel doesn't have the ability
to do.
This I think is a must-have feature on TS.
参见文档:https://github.com/babel/babel/tree/main/eslint/babel-eslint-parser#typescript
所以基本上,如果你的项目是纯TS项目,就用@typescript-eslint
{
"plugins": ["@typescript-eslint"],
"parser": "@typescript-eslint/parser",
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
]
}
如果你的项目同时有TS和JS,你也可以使用@babel/eslint-parser
{
"parser": "@babel/eslint-parser",
"extends": ["airbnb", "plugin:prettier/recommended"],
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"jest": true
},
"settings": {
"import/resolver": {
"node": {
"extensions": [".js", ".jsx", ".ts", ".tsx"]
}
}
},
"rules": {
"import/extensions": [
"error",
"ignorePackages",
{
"js": "never",
"jsx": "never",
"ts": "never",
"tsx": "never"
}
]
},
"overrides": [
{
"files": ["*.{ts,tsx}"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": ["plugin:@typescript-eslint/recommended"]
}
]
}
只是明白使用@babel/eslint-parser
而不是默认的解析器esprima
是因为babel可以在一些实验特性上进行lint(不多)
在将 ESLint 引入现有的 Typescript 代码库后,我遇到了一些解析错误。
我已经修复了大部分 lint 错误,但是 babel-eslint
作为解析器会抛出很多这样的错误:
23:32 error Parsing error: Unexpected token, expected ","
21 | return state.set(
22 | 'callsInProgress',
> 23 | (state.callsInProgress as any).filter(i => i !== action.payload)
| ^
24 | );
25 | }
26 | case actions.API_RESET: {
我认为这是因为 babel
不理解类型转换 as any
。
我如何通过解析器得到它?
我的babel配置如下:
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'],
plugins: ['@babel/plugin-proposal-class-properties', '@babel/plugin-transform-runtime', '@babel/plugin-transform-typescript']
};
我有一个项目正在使用 babel、eslint 和 typescript。
我建议您停止使用 eslint-babel
并改用 @typescript-eslint
/
typescript-eslint 是由 Tslint (现已弃用) 的开发人员启动的项目。它完美地检查打字稿代码。
这是我的 eslint 安装的 npm 包的示例:
"@typescript-eslint/eslint-plugin": "^2.34.0",
"@typescript-eslint/parser": "^2.34.0",
"eslint": "^5.16.0",
"eslint-plugin-import": "^2.21.2",
"eslint-plugin-jsx-a11y": "^6.3.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-react": "^7.20.0",
我的例子 .eslintrc
:
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
'eslint-plugin-node',
],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
parserOptions: {
"ecmaVersion": 2020
},
rules: {
"comma-dangle": ["error", {
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "always-multiline",
"exports": "always-multiline",
"functions": "always-multiline",
}],
},
env: {
es6: true,
browser: true,
node: true,
},
parserOptions: {
project: './tsconfig.json',
tsconfigRootDir: __dirname,
},
globals: {
"global": false,
"Promise": false,
},
};
注意:我不知道 eslint-babel
是否可以与 @typescript-eslint
兼容,也许可以,您可以同时使用两者。
在经历了从 JavaScript 到 TypeScript 的升级后,我终于同意接受的答案。 Post 这个答案提供了一些额外的关键点。
- @babel/eslint-parser(之前的babel-eslint)可以解析TS,让ESLint在TS上工作。
@babel/eslint-parser is a parser that allows ESLint to run on source code that is transformed by Babel.
- @babel/eslint-parser 不能也将无法检查 TypeScript 的类型问题
since @typescript-eslint uses TypeScript under the hood, its rules can be made type-aware, which is something Babel doesn't have the ability to do. This I think is a must-have feature on TS.
参见文档:https://github.com/babel/babel/tree/main/eslint/babel-eslint-parser#typescript
所以基本上,如果你的项目是纯TS项目,就用@typescript-eslint
{
"plugins": ["@typescript-eslint"],
"parser": "@typescript-eslint/parser",
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
]
}
如果你的项目同时有TS和JS,你也可以使用@babel/eslint-parser
{
"parser": "@babel/eslint-parser",
"extends": ["airbnb", "plugin:prettier/recommended"],
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"jest": true
},
"settings": {
"import/resolver": {
"node": {
"extensions": [".js", ".jsx", ".ts", ".tsx"]
}
}
},
"rules": {
"import/extensions": [
"error",
"ignorePackages",
{
"js": "never",
"jsx": "never",
"ts": "never",
"tsx": "never"
}
]
},
"overrides": [
{
"files": ["*.{ts,tsx}"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": ["plugin:@typescript-eslint/recommended"]
}
]
}
只是明白使用@babel/eslint-parser
而不是默认的解析器esprima
是因为babel可以在一些实验特性上进行lint(不多)