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.
