La propiedad 'autorización' no existe en el tipo 'Solicitud'

Aug 20 2020

Considere este código:

  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
  })

Lo que genera el siguiente error TS:

La propiedad 'autorización' no existe en el tipo 'Solicitud'.

Esto viene de intentar acceder a completeHeader.headers.authorization. De hecho, la propiedad authorizationno está disponible en la Express.requestinterfaz. Es extraño que TypeScript no pueda inferir el tipo del objeto literal, que claramente es de tipo string. Cuando no se define el tipo as Express.Request, se arroja un error sobre una asignación insegura.

¿Es necesario crear una nueva interfaz TS solo para este campo? ¿O estamos usando un tipo incorrecto? El campo authorizationparece ser un campo de uso común para enviar tokens.

Respuestas

2 DaneBrouwer Aug 20 2020 at 18:59

La razón es porque estás obligando completeHeader.headersal Express.Requesttipo. El tipo forzado anula el tipo inferido.

Lo que puede hacer es expandir ese tipo forzado haciendo lo siguiente:

as Express.Request & { authorization: string }

o podría crear un tipo completamente nuevo:

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