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.

Argumento de tipo ‘Function | FieldValue’ no se puede asignar a un parámetro de tipo ‘string’.

Creo un modelo de usuario:

class UserModel extends Model {
static table = 'users'
static timestamps = true

static fields = {
    id: { primaryKey: true, autoIncrement: true},
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    birthday: DataTypes.DATE,
    phoneNumber: DataTypes.INTEGER,
}
}

while comparo la contraseña del usuario existente con la nueva:
```ts
async signin(user: Pick<user, "username"="" |="" "password"="">){
const { username, password } = user;
</code></pre>

<pre><code class="language-ts">const existentUser = await UserModel.where('username', username).first()

if (!existentUser) throw new CustomErrorHandler(Status.NotFound, "El usuario no existe")

const isPasswordCorrect = await bcrypt.compare(password, existentUser.password); // El argumento de tipo 'Function | FieldValue' no es asignable al parámetro de tipo 'string'.
</code></pre>

<pre><code class="language-ts">// El tipo 'null' no es asignable al tipo 'string'.
}
</code></pre>

<pre><code class="language-ts">Obtengo este error de ts:
</code></pre>

El argumento de tipo 'Function | FieldValue' no es asignable al parámetro de tipo 'string'.
El tipo 'null' no es asignable al tipo 'string'.

<pre><code class="language-ts">Puedo solucionarlo forzando el tipo usando:
</code></pre>

const isPasswordCorrect = await bcrypt.compare(password, <string>existentUser.password);

```
pero estoy buscando otra solución. ¿Existe otro enfoque para convertir el modelo devuelto por 'first()' a la interfaz 'User' o algo más?</user,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes definir el tipo de retorno del método first() utilizando la palabra clave as para convertir el valor de retorno a la interfaz o tipo deseado. Por ejemplo, puedes definir tu método first() de esta manera:

    static async where(field: string, value: any): Promise<user |="" null=""> {
      const result = await db.query().select().from(this.table).where(field, value).first();
      return result as User | null;
    }
    

    Esto convertirá el valor de retorno del método first() a la interfaz User o a null si no se encontró ningún usuario. Luego puedes usarlo en tu método signin de la siguiente manera:

    const existentUser = await UserModel.where('username', username);
    
    if (!existentUser) throw new CustomErrorHandler(Status.NotFound, "El usuario no existe");
    
    const isPasswordCorrect = await bcrypt.compare(password, existentUser.password as string);
    

    Al hacer esto, puedes evitar la conversión de tipos por completo y tener más seguridad de tipos en tu código.

Comments are closed.