'Otorisasi' properti tidak ada pada jenis 'Permintaan'

Aug 20 2020

Pertimbangkan kode ini:

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

Yang menghasilkan kesalahan TS berikut ini:

Properti 'otorisasi' tidak ada pada jenis 'Permintaan'.

Ini berasal dari mencoba mengakses completeHeader.headers.authorization. Properti authorizationmemang tidak tersedia di Express.requestantarmuka. Aneh bahwa TypeScript tidak dapat mengubah tipe dari objek literal, yang jelas merupakan tipe string. Saat tidak menentukan jenis, as Express.Requestkesalahan muncul tentang tugas apa pun yang tidak aman.

Apakah diperlukan untuk membuat antarmuka TS baru hanya untuk bidang yang satu ini? Atau apakah kita menggunakan tipe yang salah? Bidang tersebut authorizationterlihat seperti bidang yang umum digunakan untuk mengirim token.

Jawaban

2 DaneBrouwer Aug 20 2020 at 18:59

Alasannya adalah karena Anda memaksakan completeHeader.headersdiri pada Express.Requesttipe tersebut. Jenis yang dipaksakan menggantikan jenis yang disimpulkan.

Apa yang dapat Anda lakukan adalah memperluas tipe yang dipaksakan itu dengan melakukan hal berikut:

as Express.Request & { authorization: string }

atau Anda dapat membuat jenis yang benar-benar baru:

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