TypeScript:强制接口只包含特定类中存在的属性键

TypeScript:强制接口只包含特定类中存在的属性键,typescript,Typescript,我有以下类用作对象关系映射器的实体: @Entity("MyEntity") export class MyEntity { @PrimaryGeneratedColumn() id!: number; @Column("varchar", { length: 2000 * 2 }) data!: string; @CreateDateColumn() created!: Date; } 由于某种原因,我的大部分代码都不使用这个类。 相反,代码使用“模型”接口,该接

我有以下类用作对象关系映射器的实体:

@Entity("MyEntity")
export class MyEntity {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column("varchar", { length: 2000 * 2 })
  data!: string;

  @CreateDateColumn()
  created!: Date;
}
由于某种原因,我的大部分代码都不使用这个类。 相反,代码使用“模型”接口,该接口是此类的松散子集:

export interface MyModel {
  id: number;
  data: string;
}
这种方法的一个问题是,模型接口很容易与实体类不同步。 这就引出了我的问题:


我如何静态强制执行
MyModel
的所有属性键也存在于
MyEntity
中?
我不确定是否收到了您的问题,但您可以
实现接口并强制执行这些属性

接口模型{
id:编号;
数据:字符串;
}
//这引发:类“MyEntity”错误地实现了接口“MyModel”。
类MyEntity实现MyModel{
}
//这很有效
类MyEntity实现MyModel{
数据:字符串;
id:编号;
}

通常你会走另一条路。定义一个接口(契约),然后让你的类实现这个接口。我的问题实际上是相反的方向。获取接口并确保接口“符合”类(不更改类的任何一行)。这将产生一个比简单的“实现”更复杂、更复杂的解决方案。你的意思是你的接口应该“实现”你的类吗?当你想确保类中的某些属性有一个接口时,
implements
是一种方法。您不能只是将它们“编译”到类中,因为接口没有任何值声明(只是类型),所以它们在技术上只是作为未定义的对象。您可能想向我解释为什么要实现这一点,以及您想用它做什么。如果您愿意,您可以从技术上编写一个接口来扩展类。这可能是有原因的,也许是为了试验高级的TypeScript功能。但我认为不值得这么麻烦,因此接受了这个答案。