Узел js + Возражение js + Postgresql. Аргумент типа '{ token: string }' не может быть назначен параметру типа 'PartialUpdate<User>'
Среда:
- узел JS
- ES6
- knex: ^ 0.16.3
- возражение: ^ 1.5.3
- pg: ^ 7.8.0 ~ postgresql
Проблема:
Я не могу обновить токен пользователя в базе данных. Я получаю сообщение об ошибке из машинописи.
Сообщение об ошибке машинописи:
Аргумент типа '{токен: строка; }'нельзя назначить параметру типа' PartialUpdate
'. Объектный литерал может указывать только известные свойства, а "токен" не существует в типе "PartialUpdate<Пользователь>".
Проблемный метод
Если я напишу @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' },
},
};
}
}
2 ответа
Проблема заключалась в том, что я не определял типы переменных в моей модели. Пример из официальной библиотеки, который дал мне знать о том, что я сделал неправильно - 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;
}
};
** Пожалуйста, предоставьте код с переменной partUpdate. потому что у вас возникла ошибка из-за неправильного объявления типа переменной partalUpdate. TypeScript полностью ориентирован на переменную Type, и, если тип переменной не соответствует содержимому, которое вы предоставляете для этой переменной, генерируется ошибка типа. вы передаете значение типа объекта {token:string} в вашу переменную partUpdate, которая может содержать переменную типа строки только тогда, когда вы ее объявили. **
PartialUpdate:Object
или же
PartialUpdate = {}
решит проблему.