Mikro-orm 中的可选道具

Fir*_*ard 4 node.js typescript mikro-orm

我正在尝试弄清楚如何定义其他可选属性。

import { Entity, PrimaryKey, Property, OptionalProps } from '@mikro-orm/core';

@Entity()
export abstract class BaseEntity {
  [OptionalProps]?: 'createdAt';

  @PrimaryKey()
  id: number;

  @Property()
  createdAt: Date = new Date();

}

@Entity()
export class EntityA extends BaseEntity {
  [OptionalProps]?: 'isAnotherProperty'; // This is the bit I cannot figure out

  @Property()
  isAnotherProperty: boolean = false;

}
Run Code Online (Sandbox Code Playgroud)

使用上面的 TypeScript 会抛出错误:

Property '[OptionalProps]' in type 'EntityA' is not assignable to the same property in base type 'BaseEntity'.
Run Code Online (Sandbox Code Playgroud)

基本上 myBaseEntity有可选属性,就像EntityA. 我可以删除[OptionalProps]?:fromBaseEntity和 have [OptionalProps]?: 'createdAt' | 'isAnotherProperty';in EntityA,但我的许多实体不需要任何额外的可选属性createdAt,因此[OptionalProps]?: 'createdAt';如果我可以在需要的地方“扩展”它,我宁愿不必在每个实体类中重复。

是否可以追加或覆盖[OptionalProps]

Mar*_*mek 8

2023年更新

即将推出的 v6 将有另一种方法来标记类型级别的可选属性 -Opt类型,它不会受到扩展问题的影响。您可以通过两种方式使用(并且不会:

import { Entity, PrimaryKey, Property, Opt } from '@mikro-orm/core';

@Entity()
export abstract class BaseEntity {

  @PrimaryKey()
  id: number;

  @Property()
  createdAt: Date & Opt = new Date(); // either intersect

}

@Entity()
export class EntityA extends BaseEntity<'isAnotherProperty'> {

  @Property()
  isAnotherProperty: Opt<boolean> = false; // or use it as a generic

}
Run Code Online (Sandbox Code Playgroud)

这种方法可以与符号结合起来OptionalProps

https://mikro-orm.io/docs/next/guide/relationships#alternative-approach-with-opt-type


较旧(但仍然有效)的方法

也许最干净的方法是通过基本实体上的类型参数:

import { Entity, PrimaryKey, Property, OptionalProps } from '@mikro-orm/core';

@Entity()
export abstract class BaseEntity<Optional = never> {

  [OptionalProps]?: Optional | 'createdAt';

  @PrimaryKey()
  id: number;

  @Property()
  createdAt: Date = new Date();

}

@Entity()
export class EntityA extends BaseEntity<'isAnotherProperty'> {

  @Property()
  isAnotherProperty: boolean = false;

}
Run Code Online (Sandbox Code Playgroud)