打字稿:属性'已解码'在请求类型上不存在

时间:2016-02-07 11:35:27

标签: javascript node.js express typescript request

我在javascript中有这个代码:

if (token) {

    // verifies secret and checks exp
    jwt.verify(token, Config.Secret, function(err, decoded) {      
      if (err) {
        return res.json({ success: false, message: 'Failed to authenticate token.' });    
      } else {
        // if everything is good, save to request for use in other routes
        req.decoded = decoded;    
        next();
      }
    });

  } else {

    // if there is no token
    // return an error
    return res.status(403).send({ 
        success: false, 
        message: 'No token provided.' 
    });

  }

想要将其重写为打字稿但却收到错误Property decoded does not exists on type Request

任何想法如何解决?

5 个答案:

答案 0 :(得分:3)

您需要使用声明合并来为自定义Request字段添加类型定义。为此,请创建一个如下所示的.d.ts文件:

declare module Express {
  export interface Request {
    decoded: string;
    // etc.
  }
}

并将其添加到编译上下文中,以便编译器将类型定义与express.d.ts中的类型定义合并。

答案 1 :(得分:3)

如果您不想扩展新类请求,您可以将请求作为对象访问:

req['decoded'] = decoded;

如果它仍然抛出你,你可能需要将req作为对象(打字稿):

(<Object>req)['decoded'] = decoded;

您甚至可以将req转换为输入any并将其解码为属性(typescript):

(<any>req).decoded = decoded;

答案 2 :(得分:0)

即使可能,我也不会合并具有相同名称的模块的接口。我宁愿创建一个新的自定义界面,您甚至可以在使用它的同一个文件中声明它。 (否则,只需将其导出)

import {Request, Response} from "express";

interface CustomRequest extends Request {
    decoded: string;
}

这更清洁,而且更接近OOP。

答案 3 :(得分:0)

该错误意味着来自express的原始Request类型不具有该名称的任何字段。

您有两个选项可以解决此问题,第一个问题是Vadim Macagon指出,您可以创建一个声明模块文件并添加自定义字段,这样就可以在每个请求中使用该字段。

declare module Express {
  export interface Request {
    decoded: string;
    // etc.
  }
}

选项二,您可以创建一个自定义界面,扩展原始请求并添加解码字段。

export default interface ICustomRequest extends Request {
  token: string;
}

然后在你的代码中

app.post('/', function (req: ICustomRequest, res) {
  req.decoded = decoded; // No errors here
});

第一个解决方案是将“自定义字段”“添加”到Request,第二个解决方案是添加字段并从“请求”扩展。

在您的情况下,我会使用第一个解决方案,以避免每次必须使用请求中的decoded字段时写入ICustomRequest(或您选择的任何名称),文件.d.ts don'需要在您的代码中导入,这样您就可以创建文件并完成。

答案 4 :(得分:0)

我的'decoded'只是user_id字符串,我这样解决了这个问题:

req.body.decoded = decoded;    
next();