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

jac*_*les 6 javascript node.js express typescript

我已经安装了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
Run Code Online (Sandbox Code Playgroud)

错误1是这样的:

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

因此bodyParser.json()返回a createServer.NextHandleFunction但没有该pop属性。NextHandleFunction定义如下@types/connect

export type NextHandleFunction = (req: http.IncomingMessage, res: http.ServerResponse, next: NextFunction) => void;
Run Code Online (Sandbox Code Playgroud)

是的,不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"
}
Run Code Online (Sandbox Code Playgroud)

小智 25

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

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);
Run Code Online (Sandbox Code Playgroud)


Cod*_*rer 11

正如其他答案中所建议的那样,您不必强制转换中间件。我相信次要软件包版本之间可能存在一些不兼容性@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",
Run Code Online (Sandbox Code Playgroud)

我现在可以写了

import {json, urlencoded} from "express";

...

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

...

app.post("./", json(), this.doPost.bind(this));
Run Code Online (Sandbox Code Playgroud)

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

  • `"@types/express-serve-static-core": "^4.17.21"` 是这个问题的解决方案。这是您需要覆盖的暂时依赖项。 (2认同)

小智 8

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

  • 我对此表示赞成,因为我尝试了您的建议,并且我的项目似乎仍然有效。事实证明这是错误的。类型**不**与express捆绑在一起,你仍然需要`@types/express`——我只是不小心仍然通过我没有删除的`@types/cookie-parser`将它们作为传递依赖项。不过,有关删除“body-parser”的信息是准确的。 (5认同)

Kar*_* VK 6

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

import express, { RequestHandler } from 'express';
Run Code Online (Sandbox Code Playgroud)

还要更改express.json()和express.urlencoded({extend: true})如下。

this.app.use(express.json() as RequestHandler);
this.app.use(express.urlencoded({ extended: true }) as RequestHandler);
Run Code Online (Sandbox Code Playgroud)

  • 我没有投反对票,但正如您从我的回答中看到的那样,不需要进行类型转换,并且可能会隐藏稍后引入的其他错误。看起来 OP 的 bug 是由错误/不兼容的类型引起的,现已修复。 (2认同)