'{ title: string; 类型的参数}' 不可分配给“RequiredEntityData<Post>”类型的参数

我正在学习 Ben 的 Awad 视频:Fullstack React GraphQL TypeScript 教程。我遇到了打字稿的问题。

enter image description here

我不明白为什么编译器认为 Post 是 {title:string} 的类型。

我的代码:

import { Entity, PrimaryKey, Property, OptionalProps } from '@mikro-orm/core';
import { Field, Int, ObjectType } from 'type-graphql';

@ObjectType()
@Entity()
export class Post {
  [OptionalProps]?: 'title'; // id is there automatically

  @Field()
  @PrimaryKey()
  _id!: number;

  @Field(() => String)
  @Property()
  createdAt: Date = new Date();

  @Field(() => String)
  @Property({ onUpdate: () => new Date() })
  updatedAt: Date = new Date();

  @Field(() => String)
  @Property()
  title?: string;

我的 app.ts

const main = async () => {
    const orm = await MikroORM.init(microConfig);
    await orm.getMigrator().up();
    const post = orm.em.create(Post, {title: 'new post'}); // here is error
    await orm.em.persistAndFlush(post);
}

main();
stack overflow Argument of type '{ title: string; }' is not assignable to parameter of type 'RequiredEntityData<Post>'
原文答案

答案:

作者头像

只需将 create 方法的“数据”属性输入为 RequiredEntityData<Post> ,如下所示:

enter image description here

作者头像

导出后,确保对其他实体也使用 OptionalProps 而不仅仅是标题。

  [OptionalProps]?: "title" | "updateAt" | "createdAt";

您不需要将 id 添加为可选,因为我们希望 id 是必需的并且作为主键。

那应该可以解决错误!

作者头像

我曾经遇到过同样的问题,问题是 TS 不知道您尝试传递它的对象的类型,并且它正在扩展 orm.create(Post , ... ) 的第一个参数中定义的类型的对象这个问题有多种解决方案:

1:使用以下命令创建实体数据,TS 将自行推断类型:

await orm.em.nativeInsert(Post, { name: "my second post" });

2:通过从ORM本身导入RequiredEntityData来写Post的类型

import { MikroORM, RequiredEntityData } from "@mikro-orm/core";
// make a post to the database
  const post = orm.em.create(Post, {
    name: "my first post",
  } as RequiredEntityData<Post>);

3:只需将其类型写为 Post 而不从 ORM 导入任何内容:

// make a post to the database
  const post = orm.em.create(Post, {
    name: "my first post",
  } as Post);

相关问题