打字稿:开发环境中"Left side of comma operator is unused and has no side effects"错误



问题

当我试图用npm run dev:server启动我的开发环境时,我得到了这个错误:

return new TSError(diagnosticText, diagnosticCodes);
^
TSError: ⨯ Unable to compile TypeScript:
src/routes/snippets.ts:6:26 - error TS2695: Left side of comma operator is unused and has no side effects.
6 exports.snippetRouter = (0, express_1.Router)();

然后服务器崩溃。但当我运行npm run build项目时,编译没有任何错误。然后我可以运行node build/server.js,一切都正常工作。我的编辑器中也没有收到任何错误或警告。

我查找了类似的错误,但找不到与我的情况相匹配的内容。

有什么想法吗?我该怎么解决?

还值得一提的是,如果我从server.ts中注释/删除app.use('/api/snippets', snippetRouter)行并运行npm run dev:server,那么一切都会正常工作(当然,除了缺少的功能)。

项目

项目结构:

src
├── controllers
|   └── snippets.ts
├── middleware
│   ├── index.ts
|   └── asyncWrapper.ts
├── routes
|   └── snippets.ts
└── server.ts

控制器/代码段.ts

import { Request, Response, NextFunction } from 'express';
import { asyncWrapper } from '../middleware';
export const createSnippet = asyncWrapper(
async (req: Request, res: Response, next: NextFunction): Promise<void> => {
res.status(201).json({
data: "test msg"
});
}
);

中间件/asyncWrapper.ts

import { Request, Response, NextFunction } from 'express';
type Foo = (req: Request, res: Response, next: NextFunction) => Promise<void>;
export const asyncWrapper =
(foo: Foo) => (req: Request, res: Response, next: NextFunction) => {
return Promise.resolve(foo(req, res, next)).catch(next);
};

路由/片段.ts

import { Router } from 'express';
import { createSnippet } from '../controllers/snippets';
export const snippetRouter = Router();
snippetRouter.route('/').post(createSnippet);

服务器.ts

import express from 'express';
import { snippetRouter } from './routes/snippets';
const app = express();
app.use('/api/snippets', snippetRouter);
app.listen(5000, () => {
console.log('Server is working');
});

package.json

{
"name": "snippet-hub",
"version": "1.0.0",
"description": "",
"main": "src/server.ts",
"scripts": {
"init:client": "npm install --prefix=client",
"init:server": "npm install",
"init": "npm-run-all -n init:**",
"dev:client": "npm start --prefix=client",
"dev:server": "nodemon src/server.ts",
"dev": "npm-run-all -n --parallel dev:**",
"build:clear": "rm -rf build",
"build:tsc": "tsc",
"build": "npm-run-all -n build:**"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/express": "^4.17.13",
"@types/node": "^16.9.2",
"@types/validator": "^13.6.3",
"nodemon": "^2.0.12",
"npm-run-all": "^4.1.5",
"ts-node": "^10.2.1",
"typescript": "^4.4.3"
},
"dependencies": {
"dotenv": "^10.0.0",
"express": "^4.17.1",
"sequelize": "^6.6.5",
"sqlite3": "^5.0.2",
"umzug": "^3.0.0-beta.16"
}
}

tsconfig.json

{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./build",
"rootDir": "./src",
"strict": true,
"noImplicitAny": false,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src"]
}

我也有同样的错误,我修复它的方法是导入express而不是销毁它,然后从express调用路由器。将文件routes/snippets.ts调整为以下修复了问题

import express from 'express';
export const snippetRouter = express.Router();
snippetRouter.route('/').post(createSnippet);

以上解决了问题

当我使用箭头函数时,通过返回一个由{}包围的键值对对象,得到了这个问题。以下是发生问题时的代码

const methodTest=(value)=>{ key1 : value,key2:value } 

解决方案是在大括号{}周围添加一个()示例:下面是为我工作的解决方案

const methodTest=(value)=>({key1:value , key2:value })

最新更新