node.js - Node js + Objection js + Postgresql. Argument av typen '{ token: string }' kan inte tilldelas parametern av typen 'PartialUpdate'
Miljö:
- node js
- ES6
- knex: ^0.16.3
- invändning: ^1.5.3
- 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.
