【问题标题】:Sequelize Typescript: Type 'FavoriteEntity[]' is not assignable to type 'FavoriteEntity | null'Sequelize Typescript:类型“FavoriteEntity []”不可分配给类型“FavoriteEntity |空值'
【发布时间】:2018-12-25 10:22:04
【问题描述】:

我正在使用 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”

我真的不知道哪个是正确的写法,但我仍然有一个问题......

【问题讨论】:

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


    【解决方案1】:

    findAll 将返回一个实体数组。你只想要一个或空。为此,请使用findOne。另外,你不需要在这里做return await。除非在 try-catch 块中,否则这是多余的。

    【讨论】:

    • 是的,我想我也想通了。这意味着我必须更新我的类型以反映它正在返回一个数组。当我修复界面时,它不再抱怨了......谢谢!
    • 啊哈,我不知道等待返回。再次感谢!
    猜你喜欢
    • 2018-09-19
    • 2022-08-23
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2021-11-16
    • 2016-06-24
    • 2019-06-07
    相关资源
    最近更新 更多