首页 > 解决方案 > 属性 'X 在类型 Y 中缺失,但在类型 Z 类中是必需的

问题描述

我正在用nestjs 编写一个应用程序。我的项目中有一些类作为类型(dto)。最重要的是这些:

export class InvoiceDto<TExpenses = ExpensesDto, TIncomes = IncomeDto> {
  @Prop() @IdValidator() id: string;
  @Prop() @PositionValidator() position: number;
  @Prop() @DateOfEventValidator() dateOfEvent: string;
  @Prop() @IncomeValidator() income: TIncomes;
  @Prop() @ExpensesValidator() expenses: TExpenses;
}
class GenericInvoice extends InvoiceDto<AddExpensesDto, AddIncomeDto> {}
export class AddInvoiceDto extends OmitType(GenericInvoice, [
  'id',
  'position',
] as const) {}

费用和收入是相似的,所以我将举一个例子:

export class ExpensesDto {
  @ExpenseOtherValidator() other: number;
  @ExpenseTotalValidator() total: number;
  @ExpenseSumValidator() sum: number;
}

export class AddExpensesDto extends OmitType(ExpensesDto, ['sum'] as const) {}

问题是我只会在我的一项服务的后端在费用和收入中添加“总和”字段。所以我在上面做了类似这段代码的事情(顺便说一句,我不确定这段代码是否有意义)。但是在我尝试添加发票的服务中,做 DB(几乎在函数的末尾)我有这样的东西:

    const newInvoiceRecord: InvoiceDto = {
      id: nanoid(),
      position,
      income: { // error
        sum: 0,
        ...income,
      },
      expenses: { // error
        sum: 0,
        ...expenses,
      },
      ...invoice,
    };

错误是:“AddExpensesDto”类型中缺少“属性“总和”,但在“ExpensesDto”类型中是必需的。收入领域相同。那么这里发生了什么?问题出在哪里,为什么 typechecker 关心 AddExpensesDto 和 AddIncomeDto?

标签: typescriptclassgenericsnestjs

解决方案


推荐阅读