Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

238
Vistas
Typescript da que el objeto puede ser un error nulo al pasar el objeto a la función dentro de promise.then

El siguiente es el código de una función de controlador de solicitud.

Objetivo Quería crear diferentes tipos de notificaciones según las rutas que se modifican.

 let farmerToUpdate = await FarmerModel.findById(farmerId) if (!farmerToUpdate) throw new controllerError('Farmer you want to update is deleted', 422) // farmerToUpdate.set(Object.assign(farmerToUpdate, req.body)) farmerToUpdate.set(req.body) let directModifiedPaths = farmerToUpdate.directModifiedPaths() const updatedFarmer = await farmerToUpdate.save() if (directModifiedPaths.includes('farmerCode') || directModifiedPaths.includes('centreCode')) { // farmerToUpdate is original document and updatedFarmer is document after updating createNotification(farmerToUpdate, updatedFarmer, ['farmerCode', 'lakshmiCentreCode'], true, 'Codes Updated').then( function () { directModifiedPaths = directModifiedPaths.filter(d => d !== 'farmerCode' && d !== 'lakshmiCentreCode') if (directModifiedPaths.length) { createNotification(farmerToUpdate, updatedFarmer, directModifiedPaths, false, 'Plain').then(res => {}) } }, ) }

Después de crear una notificación de un tipo cuando trato de pasar el mismo primer argumento farmerToUpdate a la función createNotification , aparece el siguiente error

Argumento de tipo '(Documento<desconocido, cualquiera, Farmer> & Farmer & { _id: ObjectId; }) | null' no se puede asignar al parámetro de tipo 'Documento<desconocido, cualquiera, Farmer> & Farmer & { _id: ObjectId; } & {Id de notificación?: número | indefinido; }'. El tipo 'null' no se puede asignar al tipo 'Document<unknown, any, Farmer> & Farmer & { _id: ObjectId; } & {Id de notificación?: número | indefinido; }'. El tipo 'null' no se puede asignar al tipo 'Document<unknown, any, Farmer>'.

Si agrego un cheque para un granjero válido para farmerToUpdate , funciona bien:

 farmerToUpdate && createNotification(farmerToUpdate, updatedFarmer, directModifiedPaths, false, 'Plain').then(res => {})

Me pregunto por qué no da el mismo error para el segundo parámetro o el tercero.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El tipo de farmerToUpdate es anulable, pero if (!farmerToUpdate) throw ... hace que ya no sea anulable en el mismo ámbito o en cualquier ámbito descendiente. ( https://www.typescriptlang.org/docs/handbook/2/narrowing.html )

Pero la función anidada tiene su propio alcance, y en ella el tipo de farmerToUpdate aún admite valores NULL.

Idealmente, es posible que el compilador determine que farmerToUpdate en realidad nunca será nulo en la función anidada, pero creo que es más complejo y el compilador simplemente no lo admite.

actualizar:

el valor de retorno de await FarmerModel.findById(farmerId) es anulable (en otras palabras: puede devolver un valor nulo) y, por lo tanto, farmerToUpdate es anulable (en otras palabras: puede ser nulo).

Pero los valores devueltos de farmerToUpdate.directModifiedPaths() y await farmerToUpdate.save() no aceptan valores NULL y, por lo tanto, updatedFarmer y directModifiedPaths no aceptan valores NULL (en otras palabras: nunca serán NULL).

Es por eso que el compilador solo se compara con farmerToUpdate , pero no updatedFarmer y directModifiedPaths .

En realidad farmerToUpdate.directModifiedPaths() debería ser farmerToUpdate!.directModifiedPaths() . Esto se debe a que el tipo de farmerToUpdate puede ser nulo, pero sabemos que nunca será nulo en ese contexto, por lo que podemos tratarlo como no anulable. El compilador puede hacer esa deducción automáticamente, por lo que podemos eliminar el signo de exclamación sin error.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda