Búsqueda de sitios web

javascript - Error de TypeScript del cliente SendGrid: HttpMethod


Tengo:

import sendgridClient from '@sendgrid/client'
sendgridClient.setApiKey(process.env.SENDGRID_API_KEY);

const sendgridRequest = {
        method: 'PUT',
        url: '/v3/marketing/contacts',
        body: {
            list_ids: [myId],
            contacts: [
                {
                    email: req.body.email,
                    custom_fields: {
                        [myFieldId]: 'in_free_trial'
                    }
                }
            ]
        }
    };


await sendgridClient.request(sendgridRequest);

Pero mi servidor de lenguaje TypeScript me da un error sobre sendgridRequest:

Argument of type '{ method: string; url: string; body: { list_ids: string[]; contacts: { email: any; custom_fields: { e5_T: string; }; }[]; }; }' is not assignable to parameter of type 'ClientRequest'.
  Types of property 'method' are incompatible.
    Type 'string' is not assignable to type 'HttpMethod'.

¿Hay alguna manera de resolver esto?

Respuesta #1

Otra forma de hacer esto en ausencia de los tipos originales:

method: 'PUT' as const,

¡Una cadena no se puede asignar a HttpMethod, pero el literal de cadena 'PUT' sí!

Más detalles: https://stackoverflow.com/a/66993654/91713

Respuesta #2

method: 'PUT' en tu objeto se está infiriendo como string, pero se espera cadenas específicas como "PUT" | "GET" | "POST". Esto se debe a que no tiene un tipo específico con el que intentar coincidir, y por defecto las cadenas específicas simplemente se infieren como string.

Probablemente puedas solucionar esto pasando tu objeto directamente a la función. Esto convierte el objeto al tipo correcto porque se verifica contra lo que esa función acepta:

await sendgridClient.request({
    method: 'PUT',
    url: '/v3/marketing/contacts',
    body: {
        list_ids: [myId],
        contacts: [
            {
                email: req.body.email,
                custom_fields: {
                    [myFieldId]: 'in_free_trial'
                }
            }
        ]
    }
})

O puedes darle a tu variable intermedia el tipo correcto importado del módulo sendgrid.

import sendgridClient, { ClientRequest } from '@sendgrid/client'

const sendgridRequest: ClientRequest  = { /* ... */ }
await sendgridClient.request(sendgridRequest);

No pude probar esto porque este módulo no parece importarse en el playground de TypeScript, pero creo que debería funcionar.

Artículos relacionados