プロパティ「承認」はタイプ「リクエスト」に存在しません

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エラーが生成されます。

プロパティ「authorization」はタイプ「Request」に存在しません。

これは、にアクセスしようとしたことによるものですcompleteHeader.headers.authorization。このプロパティauthorizationは、実際にはExpress.requestインターフェイスでは使用できません。TypeScriptがリテラルオブジェクトから型を推測できないのは不思議ですstring。リテラルオブジェクトは明らかに型です。タイプを定義しない場合as Express.Request、安全でない割り当てについてエラーがスローされます。

この1つのフィールド専用に新しい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