¿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;
}
}
“`
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étodono()
con un argumento de tipoPartial<m>
, TypeScript no puede verificar que el objeto pasado ano()
cumpla con los requisitos definidos para el tipoM
.Por otro lado, el método
yes()
se declara para tomar unaPartial<model>
, lo que permite cualquier objeto que contenga al menos una propiedadid
, por lo que no produce un error.Para solucionar el error, una opción es convertir el objeto pasado a
no()
al tipoPartial<m>
utilizando la palabra claveas
, de la siguiente manera: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:Con este cambio, si la clase
cls
se instancia sin un parámetro de tipo, se establecerá por defecto enModel
, lo que significa que los objetos parciales con al menos una propiedadid
pasarán correctamente la verificación de tipos.