类型“请求”上不存在属性“授权”

时间:2020-08-20 11:45:17

标签: javascript typescript express

考虑以下代码:

  setContext(async (req, { headers }) => {
    const token = await getToken(config.resources.gatewayApi.scopes)

    const completeHeader = {
      headers: {
        ...headers,
        authorization:
          token && token.accessToken ? `Bearer ${token.accessToken}` : '',
      } as Express.Request,
    }

    console.log('accessToken: ', completeHeader.headers.authorization)
    return completeHeader
  })

哪个会产生以下TS错误:

“请求”类型上不存在“授权”属性。

这来自尝试访问completeHeader.headers.authorization。实际上,authorization接口上没有属性Express.request。奇怪的是TypeScript无法从文字对象推断类型,而文字对象显然是string类型。如果未定义类型as Express.Request,则任何不安全的分配都将引发错误。

是否需要为此字段创建一个新的TS接口?还是我们使用了错误的类型?字段authorization看起来像是发送令牌的常用字段。

1 个答案:

答案 0 :(得分:2)

原因是因为您将completeHeader.headers强制转换为Express.Request类型。 强制类型将覆盖推断的类型。

您可以做的是,通过执行以下操作来扩展该强制类型:

as Express.Request & { authorization: string }

或者您可以创建一个全新的类型:

type AuthorizedRequest = Express.Request & { authorization: string };
...
as AuthorizedRequest