Sequelize Typescript:无法将类型'FavoriteEntity []'分配给类型'FavoriteEntity | |。空'

时间:2018-07-17 16:17:12

标签: node.js postgresql typescript sequelize.js nestjs

我正在使用Sequelize-Typescript作为ORM来编写NestJS应用程序。

在这里,我试图获取用户喜欢的工作(M:M),所以我有一个UserEntity,一个JobEntity(与该问题无关)和一个FavoriteEntity。

  

favorite.entity.ts

import { Table, Column, Model, PrimaryKey, ForeignKey, BelongsTo, NotNull } from "sequelize-typescript";
import { IDefineOptions } from "sequelize-typescript/lib/interfaces/IDefineOptions";
import { UserEntity } from "../users/user.entity";
import { JobEntity } from "../jobs/job.entity";

const tableOptions: IDefineOptions = {
  timestamp: true,
  tableName: "favorites",
  schema: process.env.DB_SCHEMA,
} as IDefineOptions;

@Table(tableOptions)
export class FavoriteEntity extends Model<FavoriteEntity> {
  @BelongsTo(() => UserEntity)
  user: UserEntity;

  @ForeignKey(() => UserEntity)
  @PrimaryKey
  @NotNull
  @Column
  userId: number;

  @BelongsTo(() => JobEntity)
  job: JobEntity;

  @ForeignKey(() => JobEntity)
  @PrimaryKey
  @NotNull
  @Column
  jobId: number;
}
  

favorite.service.ts

import { Inject, Injectable } from "@nestjs/common";
import { Model } from "sequelize-typescript";
import { IFavorite, IFavoriteService } from "./interfaces";
import { FavoriteEntity } from "./favorite.entity";

@Injectable()
export class FavoriteService implements IFavoriteService {
  constructor(
    @Inject("FavoriteRepository") private readonly favoriteRepository: typeof Model,
    @Inject("SequelizeInstance") private readonly sequelizeInstance,
  ) {}

  public async findByUserId(userId: number): Promise<FavoriteEntity | null> {
    return await FavoriteEntity.scope().findAll<FavoriteEntity>({
      where: { userId },
    });
  }
}

我收到一个我真的不明白的类型错误:

  

TSError:⨯无法编译TypeScript:   src / modules / favorite / favorite.service.ts(21,5):错误TS2322:类型   'FavoriteEntity []'不可分配给'FavoriteEntity |空值'。   类型“ FavoriteEntity []”不可分配给类型“ FavoriteEntity”。       类型“ FavoriteEntity []”中缺少属性“用户”。

我不明白为什么它抱怨缺少user,它显然在那里。 (如果我在实体中将其设置为可选(?),它将抱怨下一个属性,直到我将它们全部设置为可选,然后又以相同的方式抱怨缺少属性dataValues)

我想念什么?

谢谢!

更新: 所以我可能已经发现了一些东西。如果我这样写

return await FavoriteEntity.scope().findAll<FavoriteEntity[]>({
  where: { userId },
});

使用FavoriteEntity[]代替FavoriteEntity,我得到

  

类型“ FavoriteEntity []”中缺少属性“ dataValues”

我真的不知道哪种写法是正确的,但是无论如何我还是有问题...

1 个答案:

答案 0 :(得分:1)

<link href="https://selectize.github.io/selectize.js/css/selectize.default.css" rel="stylesheet"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> <script src="https://selectize.github.io/selectize.js/js/selectize.js"></script> <input id="input-tags" value="a,b"> <input id="input-tags2" value="a,b">将返回一个实体数组。您只想要一个或为空。为此,请使用findAll。另外,您无需在此处执行findOne。除非在try-catch块中,否则这是多余的。