Свойство "авторизация" не существует для типа "Запрос"

Aug 20 2020

Рассмотрим этот код:

  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похоже на часто используемое поле для отправки токенов.

Ответы

2 DaneBrouwer Aug 20 2020 at 18:59

Причина в том, что вы принуждены completeHeader.headersк Express.Requestтипу. Принудительный тип переопределяет предполагаемый тип.

Что вы можете сделать, так это расширить этот принудительный тип, выполнив следующие действия:

as Express.Request & { authorization: string }

или вы можете создать совершенно новый тип:

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