如何用基于接口的值填充猫鼬实体?

时间:2020-09-03 18:51:13

标签: typescript mongoose nestjs typescript-typings

我正在使用NestJS API,并且试图用猫鼬创建一些文档,但是遇到了一些问题。我遵循NestJS Mongo DocsAuth0 API Guide来掌握您应该做的事情。

[注意]我删除了代码块上所有明显且超出范围的导入。我还注册了应有的模型,所以也没什么好问的。我也可以必要填写自己的值,因为在实际产品中,我必须进行计算以填写这些值。这就是为什么我决定先填写值,而不是仅将DTO传递给猫鼬实体的原因。

这是我的猫鼬文档实体:

// src/user/interfaces/user.interface.ts
import { Document } from 'mongoose';

export interface User extends Document {
   readonly string firstName;
   readonly string lastName;
   readonly string fullName;
}

但是..当我尝试像这样填充服务中的值时:

// src/user/user.service.ts
import { User } from './interfaces/user.interface';

@Injectable();
export class UserService {
  constructor(
    @InjectModel("User")
    private readonly userModel: Model<User>,
  ) {}

  async createUser(dto: CreateUserDTO): Promise<User> {
    const user: User = {
       firstName: dto.firstName,
       lastName: dto.lastName,
       fullName: `${dto.firstName} ${dto.lastName}`,
    }
    return await this.userModel.create(user);
  }
}

它会导致以下错误,并且无法编译:

Type '{ firstName: string; lastName: string; fullName: string; }'
  is missing the following properties from type 'User': increment, model, $isDeleted, remove, and 52 more.ts(2740)

这些当然是错误的,因为它扩展了Mongoose文档,并且这些值未填充。


我已经尝试了以下方法,但对“解决方案”不满意

尝试1

直接将其作为参数传递,不幸的是,这并没有给我自动完成功能和验证功能

async createUser(dto: CreateUserDTO): Promise<User> {
  const newUser = new this.userModel({
    firstName: dto.firstName,
    lastName: dto.lastName,
    fullName: `${dto.firstName} ${dto.lastName}`,
  });
  return await newUser.save();
}

尝试2

创建第二个接口,并在填充中使用接口A,在返回和调用中使用接口B

// src/user/interfaces/user.interface.ts
import { Document } from 'mongoose';

export interface User {
   readonly string firstName;
   readonly string lastName;
   readonly string fullName;
}

export interface UserDoc extends User, Document {}

,然后在类似这样的服务中使用它:

// src/user/user.service.ts
import { User, UserDoc } from './interfaces/user.interface';

@Injectable();
export class UserService {
  constructor(
    @InjectModel("User")
    private readonly userModel: Model<UserDoc>,
  ) {}

  async createUser(dto: CreateUserDTO): Promise<UserDoc> {
    const user: User = {
       firstName: dto.firstName,
       lastName: dto.lastName,
       fullName: `${dto.firstName} ${dto.lastName}`,
    }
    return await this.userModel.create(user);
  }
}

现在,这可行,但是它确实很丑陋,您还必须确保在正确的时间使用正确的界面,因此非常不便。


TL; DR;有没有一种拥有强类型猫鼬实体的方法,您可以在其中放置将自动完成的值,例如Attempt B中的值,但更好且更干净?

0 个答案:

没有答案