类型“ NextHandleFunction”的参数不能分配给类型“ PathParams”的参数

时间:2018-12-04 16:07:51

标签: javascript node.js typescript express

我已经安装了TypeScript并在基本的Express服务器上运行,但是遇到了问题。

import bodyParser from 'body-parser';
import express, { Express } from 'express';

const app: Express = express();
app.use(bodyParser.json()); // Error 1
app.use(bodyParser.urlencoded({ extended: true })); // Error 2

错误1是这样的:

  

“ NextHandleFunction”类型中缺少属性“ pop”。 [2345]

因此bodyParser.json()返回一个createServer.NextHandleFunction,但没有pop属性。 NextHandleFunction@types/connect中的定义如下:

export type NextHandleFunction = (req: http.IncomingMessage, res: http.ServerResponse, next: NextFunction) => void;

是的,没有pop。但是我有什么解决方案?

错误2如下:

  

类型'NextHandleFunction'不能分配给类型'(string | RegExp)[]'。 [2345]

这里,bodyParser.urlencoded()也返回了createServer.NextHandleFunction,但这不是app.use()正在寻找的类型。

再次,不确定我在这里的选择。

package.json

"dependencies": {
    "@types/body-parser": "^1.17.0",
    "@types/connect": "^3.4.32",
    "@types/express": "^4.16.0",
    "@types/express-serve-static-core": "^4.16.0",
    "body-parser": "^1.18.3",
    "express": "^4.15.2",
    "express-serve-static-core": "^0.1.1"
},
"devDependencies": {
    "typescript": "^3.1.6"
}

4 个答案:

答案 0 :(得分:4)

删除 @types/express@types/express-serve-static-core 帮助我摆脱了这些错误,并且默认情况下类型也捆绑在 express 中.所以,不要犹豫,删除它们。此外,您不再需要 body-parser,因为 json 和 url-encoded 中间件捆绑在 express it-self 中。

答案 1 :(得分:4)

我能够通过这种方式修复错误:

import bodyParser from 'body-parser';
import express, { Express, RequestHandler } from 'express';

const app: Express = express();
app.use(bodyParser.json() as RequestHandler);
app.use(bodyParser.urlencoded({ extended: true }) as RequestHandler);

答案 2 :(得分:3)

在 app.ts 中添加如下导入语句。

import express, { RequestHandler } from 'express';

同时更改 express.json() 和 express.urlencoded({ extended: true }) 如下。

this.app.use(express.json() as RequestHandler);
this.app.use(express.urlencoded({ extended: true }) as RequestHandler);

答案 3 :(得分:0)

您不必像其他答案中所建议的那样强制转换中间件。我相信次要 @types/* 软件包版本之间可能存在一些不兼容。在删除一些类型包依赖项、删除 node_modules/@types 并显式安装 @types/express@types/express-serve-static-core@types/cookie-parser(您可能不需要那个)之后,我得到了 (等等)

        "@types/cookie-parser": "^1.4.2",
        "@types/cors": "^2.8.10",
        "@types/express": "^4.17.12",
        "@types/express-serve-static-core": "^4.17.21",

我现在可以写了

import {json, urlencoded} from "express";

...

app.use(urlencoded({extended: false}));

...

app.post("./", json(), this.doPost.bind(this));

这些类型检查没有显式转换。我不确定旧包到底出了什么问题,或者是否有某种传递性 de-dupe 选择了错误的组合,但上面的版本似乎可以正常工作。