Node js + Objection js + Postgresql.类型为"{ token:字符串 }"的参数不可分配给类型为"部分更新"的参数<User>



环境:

  1. 节点JS
  2. ES6
  3. knex: ^0.16.3
  4. 异议: ^1.5.3
  5. pg: ^7.8.0 〜postgresql

问题:

我无法在数据库中更新用户令牌。我从Typescript收到错误消息。

打字稿错误消息:

类型'{token:string的参数;}'不能分配给参数 类型为" partialupdate&lt;用户>"。对象文字只能指定已知的 属性和"令牌"在类型" partialupdate&lt; 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' },
      },
    };
  }
}

问题是我没有定义模型中的变量类型。官方图书馆的一个示例让我知道我做错了什么-https://github.com/vincit/objection.js/tree/master/master/master/examples/express-ts-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;
  }
};

**请提供可变partialupdate的代码。因为由于错误声明可变partialupdate的类型是错误的。打字稿完全专注于变量类型,如果变量的类型与您提供的内容的类型与该变量类型错误生成的内容不匹配。您将对象类型值{token:string}传递给您的变量partialupdate,该partialupdate仅在声明时只能保存字符串类型变量。**

PartialUpdate:Object

PartialUpdate = {}

将解决问题。

最新更新