typescript 与A类字段相同的B类

0mkxixxg  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(105)

我仍然在寻找一个干净的方法来声明第二个类,它与第一个类具有相同的字段。我想这是不可能的,正如我在编译时看到的,我们不能有类字段。即使在运行时,具有Object.keys的字段也只有在初始化后才可能。(将返回定义的值)。
案例:

class Entity {
  public id!: string;

  public uuid!: string;

  public firstname!: string;

  public lastname!: string;
}

现在我想添加weights(可能对客户机代码进行了少量重构)。
从逻辑上讲,如果可能的话,我需要在同一个类上声明weights,或者在第二个孪生类中声明weights,如:

class EntityWeights {
  public id!: number;

  public uuid!: number;

  public firstname!: number;

  public lastname!: number;
}

然后我会密切关注这两个类,以获得一致的代码(不是最优的)。
如果我只改变Entity来增加权重,我会这样做:

class Entity {
  public id!: [string, number];

  public uuid!: [string, number];

  public firstname!: [string, number];

  public lastname!: [string, number];
}

我尝试了这个方法,在客户端代码上,我将const entity = new Entity({___})传递给其他代码,如putInDB(entity),我不能重构它,使其只有权重或值。
你会怎么做?

e4yzc0pl

e4yzc0pl1#

您可以使用implements来约束EntityWeights,使其具有Record<keyof Entity, unknown>Entity的 * 每个属性 *。每个属性都是必需的,但您可以自由选择它们的类型。

class EntityWeights implements Record<keyof Entity, unknown> {
  public id!: number;
  public uuid!: number;
  public firstname!: number;
  public lastname!: number;
}

缺少属性时将出现错误:

class EntityWeights2 implements Record<keyof Entity, unknown> {
//    ^^^^^^^^^^^^^^ Error: Type 'EntityWeights2' is missing the following properties from type 'Record<keyof Entity, unknown>': firstname, lastname(2420)
  public id!: number;
  public uuid!: number;
}

Playground

相关问题