节点 js + 对象 js + Postgresql。 “{token: string }”类型的参数不可分配给 'PartialUpdate<User>' 类型的参数

Node js + Objection js + Postgresql. Argument of type '{ token: string }' is not assignable to parameter of type 'PartialUpdate<User>'

环境:

  1. 节点js
  2. ES6
  3. 膝盖:^0.16.3
  4. 异议:^1.5.3
  5. pg: ^7.8.0 ~ postgresql

问题:

我无法更新数据库中的用户令牌。我从打字稿中收到一条错误消息。

打字稿错误信息:

Argument of type '{ token: string; }' is not assignable to parameter of type 'PartialUpdate<User>'. Object literal may only specify known properties, and 'token' does not exist in type 'PartialUpdate<User>'.

问题方法

如果我写@ts-ignore,这个方法就可以了,但是我看不懂

为什么会报错?

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;
  }
};

我的用户模型

'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' },
      },
    };
  }
}

**请提供带有变量 partialUpdate 的代码。因为您由于变量 partialUpdate 类型的错误声明而出错。 TypeScript 完全专注于变量类型,如果变量的类型与您提供的内容不匹配,则会生成该变量类型错误。您正在将对象类型值 {token:string} 传递给您的变量 partialUpdate ,它在您声明它时只能保存字符串类型变量。 **

PartialUpdate:Object

PartialUpdate = {}

将解决问题。

问题是我没有在我的模型中定义变量的类型。官方图书馆的一个例子让我知道我做错了什么 - https://github.com/Vincit/objection.js/tree/master/examples/express-ts

更新模型

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' },
    },
  };
}

更新方法

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