es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué funciona Partial para tipos concretos pero no para subtipos en TypeScript?

Estoy preguntándome por qué se compila con error.
Supongo que debería funcionar para subtipos así como para el tipo de Modelo en sí mismo.

“`typescript
class Modelo {
id!: string;
}

class cls<m extends="" modelo=""> {
call (id: string) {
// error aquí (¿por qué?)
this.no({ id }); // El argumento del tipo '{ id: string; }' no es asignable al parámetro del tipo 'Parcial<m>'.
this.sí({ id });
}

no (m: Parcial<m>) {
return false;
}

sí (m: Parcial<modelo>) {
return true;
}
}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el código produce un error es que cuando se define un parámetro de tipo M, crea un tipo específico de modelo que se espera que se use en la clase. Por lo tanto, cuando se llama al método no() con un argumento de tipo Partial<m>, TypeScript no puede verificar que el objeto pasado a no() cumpla con los requisitos definidos para el tipo M.

    Por otro lado, el método yes() se declara para tomar una Partial<model>, lo que permite cualquier objeto que contenga al menos una propiedad id, por lo que no produce un error.

    Para solucionar el error, una opción es convertir el objeto pasado a no() al tipo Partial<m> utilizando la palabra clave as, de la siguiente manera:

    class Model {
      id!: string;
    }
    
    class cls<m extends="" model=""> {
      call (id: string) {
        this.no({ id } as Partial<m>); 
        this.yes({ id });
      }
    
      no (m: Partial<m>) {
        return false;
      }
    
      yes (m: Partial<model>) {
        return true;
      }
    }
    

    Alternativamente, se puede hacer uso de un valor predeterminado para M, lo que permitirá que se usen objetos parciales sin errores, de la siguiente manera:

    class Model {
      id!: string;
    }
    
    class cls<m extends="" model="Model"> {
      call (id: string) {
        this.no({ id });
        this.yes({ id });
      }
    
      no (m: Partial<m>) {
        return false;
      }
    
      yes (m: Partial<model>) {
        return true;
      }
    }
    

    Con este cambio, si la clase cls se instancia sin un parámetro de tipo, se establecerá por defecto en Model, lo que significa que los objetos parciales con al menos una propiedad id pasarán correctamente la verificación de tipos.

Comments are closed.