У Type отсутствуют следующие свойства

#typescript #typeorm

#typescript #typeorm

Вопрос:

Мне нужна помощь. Я создаю объект User с помощью typeorm и хочу перезаписать объект toResponseObject в классе Customer для изменения возвращаемого атрибута, но когда я пишу finished, возникает ошибка, поскольку «Тип ‘{ userName: строка; FirstName: строка; LastName: строка; email: строка; адрес: Адрес; токен: строка; }’ являетсяотсутствуют следующие свойства типа «User»: password, hasPassword, toResponObject, comparePassword» Я предполагаю, что это означает, что я должен вернуть все свойства пользователя, но я не хочу возвращать все атрибуты. Что мне делать?

user.entity.ts

 import {PrimaryColumn, Column, BeforeInsert} from "typeorm";
import * as bcrypt from 'bcryptjs'
import * as jwt from 'jsonwebtoken'

export abstract class User {

    @PrimaryColumn()
    userName: string;

    @Column()
    password: string;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    email: string;

    @BeforeInsert()
    async hasPassword(){
        this.password = await bcrypt.hash(this.password,10)
    }

    async toResponObject(showToken:boolean = true){
        const {userName,firstName,lastName,email,token} = this
        const responseObject = {userName,firstName,lastName,email,token}
        if(showToken){
            responseObject.token = token
        }
        return responseObject
    }

    async comparePassword(attemp:string){
        return await bcrypt.compare(attemp,this.password)
    }

    protected get token(){
        const {userName,password} = this
        return jwt.sign({userName,password},process.env.SECRETKEY,{expiresIn:'7d'})
    }
}
  

customer.entity.ts

 import { Pet } from "../pet/pet.entity";
import { Address } from "../address/address.entity";
import { Order } from "../order/order.entity";
import { Feedback } from "../feedback/feedback.entity";
import { User } from "../user/user.entity";
import { Entity, Column, ManyToOne, OneToMany } from "typeorm";

@Entity()
export class Customer extends User {

    @Column()
    phoneNumber: string;

    @OneToMany(type => Pet,pet => pet.owner)
    pets: Pet[];

    @ManyToOne(type => Address)
    address: Address;

    @OneToMany(type => Order,order => order.customer)
    orders: Order[];

    @OneToMany(type => Feedback,feedbacks => feedbacks.customer)
    feedbacks: Feedback[];

    async toResponObject(showToken:boolean = true):Promise<User>{
        const {userName,firstName,lastName,email,address,token} = this
        const responseObject = {userName,firstName,lastName,email,address,token}
        if(showToken){
            responseObject.token = token
        }
        return responseObject  // error ocuurs at this line
    }

}
  

Комментарии:

1. Посмотрите, поможет ли это: typeorm.io/#/select-query-builder/hidden-columns

2. спасибо за ваше предложение: D это решение не работает для меня, потому что я выясняю, что эта проблема связана с типами объектов, которые я определяю для возврата в методе. Я попытался определить новый объект, содержащий атрибуты, которые я хочу вернуть, и это работает: D но вы даете мне знания, которые я никогда не получал из TypeORM. Большое вам спасибо

3. Приветствую, приятель 👍!!

Ответ №1:

Наряду с комментарием hazardous вы можете просто вернуть часть пользователя, используя

 async toResponObject(showToken:boolean = true):Promise<Partial<User>> {
  //...
}
  

Таким образом, вам не нужно будет определять новый объект и все равно можно получить желаемый результат.