首先,我想说这个问题类似于引用this one的this one。除了明显的区别外,我和第二个链接有完全相同的问题。我正在尝试扩展由NestJS生成的定义属性的类。
我正在使用NestJs和发现here的Schema first方法。我还基于我的GraphQL模式生成了一个类文件。
以下是架构:
type Location {
name: String!
owner: User!
}
哪个生成类:
export class Location {
name: string;
owner: User;
}
现在,我想扩展此类,所以我不必重复数据(还有很多未显示的字段)。我还想添加存在于文档中但不在架构中的字段(在此示例中为_id
)。这是我的LocationDocument和我的架构。
export interface LocationDocument extends Location, Document {
_id: Types.ObjectId
}
export const LocationSchema: Schema = new Schema(
{
name: {
type: String,
required: true,
},
owner: {
type: Types.ObjectId,
ref: 'User',
}
);
现在这是我的问题。从GraphQL模式生成的Location
类将owner
属性定义为User
类型。但是实际上,在由Mongoose填充之前,它只是一个mongodb id。因此它可以是Types.ObjectId
上的User
或UserDocument
。所以我尝试将其定义为:
export interface LocationDocument extends Location, Document {
_id: Types.ObjectId
owner: User | Types.ObjectId;
}
但是这在编译器中引发了一个错误,即LocationDocument错误地扩展了Location。这是有道理的。有什么方法可以扩展用户类,但可以说所有者属性可以是用户类型(由Mongoose填充)或mongo对象ID(存储在数据库中)。
答案 0 :(得分:0)
我认为拥有可以同时使用两种类型的属性(虽然对Mongoose和JS易于使用)不是一种类型化的方式。在我的架构中,我有一个所有者,它是一个用户类型。在我的数据库和扩展它的文档中,我有一个OwnerId。因此,对于访问API的人们来说,他们并不关心这种关系的ownerId。但是在我的解析器中,我使用ID。一种是Mongo ID类型,另一种是用户类型。