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功能。但我认为不值得这么麻烦,因此接受了这个答案。