node.js - Node js + Objection js + Postgresql. Argument av typen '{ token: string }' kan inte tilldelas parametern av typen 'PartialUpdate'


Miljö:

  1. node js
  2. ES6
  3. knex: ^0.16.3
  4. invändning: ^1.5.3
  5. pg: ^7.8.0 ~ postgresql

Problem:

Jag kan inte uppdatera användartoken i databasen. Jag får ett felmeddelande från TypeScript.

Typescript-felmeddelande:

Argument av typen '{ token: string; }' kan inte tilldelas till parametern av typen 'PartialUpdate'. Objektliteral kan endast ange kända egenskaper, och 'token' finns inte i typen 'PartialUpdate'.

Problemetod

Om jag skriver @ts-ignore, kommer metoden att fungera, men jag kan inte förstå.

Varför ger det mig ett fel?

import { User } from '@database/models';

...
const setToken = async (id: any, token: string) => {
  try {
    await transaction(User.knex(), trx =>
      User.query(trx)
      // An error appears on this line
        .update({ token })
        .where({ id }),
    );
  } catch (e) {
    throw e;
  }
};

Min användarmodell

'use strict';

import { Model } from 'objection';

export default class User extends Model {
  static get tableName() {
    return 'users';
  }

  static get jsonSchema() {
    return {
      type: 'object',

      properties: {
        id: { type: 'uuid' },
        full_name: { type: 'string', minLength: 1, maxLength: 255 },
        email: { type: 'string', minLength: 1, maxLength: 255 },
        avatar: { type: 'string' },
        provider_data: {
          type: 'object',
          properties: {
            uid: { type: 'string' },
            provider: { type: 'string' },
          },
        },
        token: { type: 'string' },
        created_at: { type: 'timestamp' },
        updated_at: { type: 'timestamp' },
      },
    };
  }
}

Svar #1

Problemet var att jag inte definierade typerna av variabler i min modell. Ett exempel från det officiella biblioteket som visade mig vad jag gjort fel - https://github.com/Vincit/objection.js/tree/master/examples/express-ts

Uppdaterad modell

export default class User extends Model {
  readonly id!: v4;
  full_name?: string;
  email?: string;
  avatar?: string;
  provider_data?: {
    uid: string;
    provider: string;
  };
  token?: string;

  static tableName = 'users';

  static jsonSchema = {
    type: 'object',

    properties: {
      id: { type: 'uuid' },
      full_name: { type: 'string', minLength: 1, maxLength: 255 },
      email: { type: 'string', minLength: 1, maxLength: 255 },
      avatar: { type: 'string' },
      provider_data: {
        type: 'object',
        properties: {
          uid: { type: 'string' },
          provider: { type: 'string' },
        },
      },
      token: { type: 'string' },
      created_at: { type: 'timestamp' },
      updated_at: { type: 'timestamp' },
    },
  };
}

Uppdaterad metod

const setToken = async (id: any, token: string) => {
  try {
    User.query()
      .update({ token })
      .where({ id });
  } catch (e) {
    throw e;
  }
};

Svar #2

**vänligen tillhandahåll kod med variabeln partialUpdate. eftersom du får ett fel på grund av felaktig deklaration av typen för variabeln partialUpdate. TypeScript är helt fokuserad på variabeltyp och om typen av variabeln inte matchar innehållet du tilldelar den, genereras ett typerrors. du skickar ett objekt av typen {token:string} till din variabel partialUpdate, som endast kan innehålla en strängvariabel när du deklarerade den. **

PartialUpdate:Object

eller

PartialUpdate = {}

kommer att lösa problemet.

Relaterade artiklar