使用multer和打字稿进行表达

时间:2019-06-07 09:44:10

标签: node.js typescript express multer

背景

我正在制作一个简单的网站,用户可以在其中上传图片。 我正在使用Node / React / Multer / 打字稿

问题

app.post('/admin/uploads', async (req, res) => {
  uploadHandler(req, res, (err) => {
    ...
    if ( req.files.companyImage !== undefined ) {
      ...
    }
    res.sendStatus(201);
  });
});

打字稿智能感知显示如下错误。

Property 'companyImage' does not exist on type '{ [fieldname: string]: File[]; } | File[]'.
Property 'companyImage' does not exist on type '{ [fieldname: string]: File[]; }'.ts(2339)

但是,我不明白为什么这是错误的。我认为files对象的类型为{ [fieldname: string]: File[]; }。这意味着files对象可以具有字符串属性。

所以我用一个简单的例子进行测试。

type myType = {
  [fieldName: string]: number
}

let req: myType = {
  a: 333,
  b: 344
}

console.log(req.a);
console.log(req.c); // undefined but intellisense don't show error

我不知道为什么files对象不能具有companyImage属性。

请检查。

2 个答案:

答案 0 :(得分:1)

我不知道您是否成功解决了问题,但我遇到了同样的问题,必须像下面这样显式告诉TypeScript我的req.files属性的类型:

const files = req.files as { [fieldname: string]: Express.Multer.File[] };

请注意,由于我使用的是upload.fields(...),因此并未指定req.files也可以是简单的Express.Multer.File[]

答案 1 :(得分:-1)

我通过 Object.assign(req.files) 解决了它,然后您可以将其作为对象处理: console.log(s.image[0].path);