忽略Typescript中的属性传播

时间:2019-10-22 05:36:42

标签: typescript

我正在尝试在Typescript中创建一个省略类型。我已经添加了关于我需要的类型(DesiredType)和我要获得的类型(never类型)的注释。预先感谢!

interface IReport {
  start: Date
  end: Date
  name: string
}

type ReportVariant = 'profit' | 'expense'

interface ProfitReport extends IReport {
  variant: 'profit'
  includeGrossProfit: boolean
}

interface ExpenseReport extends IReport {
  variant: 'expense'
  includeTaxes: boolean
}

type Report = { variant: ReportVariant } & (ProfitReport | ExpenseReport)

type DesiredType = Omit<Report, IReport>
// Expecting: { variant: 'profit', includeGrossProfit: boolean } | { variant: 'expense', includeTaxes: boolean }
// Actual: never

2 个答案:

答案 0 :(得分:2)

您的代码有两个问题。第一个参数很简单,Omit的第二个参数必须是要删除的键的并集,因此您可能想要的是IReport而不是keyof IReport

距离更近,但实际上并不能将您带到所需的类型。由于Report是一个联合,因此Omit将在Report的公共属性上起作用,而不是在联合组成部分上起作用,并且Omit<Report, keyof IReport>只会为您带来{ variant: ReportVariant; },这不是事实你想要的。

您真正想要的是在每个工会组成部分上应用Omit。为此,您需要使用distribution behavior of conditional types来获取每个并集成分并应用转换:

type Report = { variant: ReportVariant } & (ProfitReport | ExpenseReport)

type DistributedOmit<T, K extends PropertyKey> = T extends T ? Omit<T, K> : never;
type DesiredType = DistributedOmit<Report, keyof IReport>

Play

答案 1 :(得分:1)

关闭。实际上是:

type DesiredType = Omit<Report, keyof IReport>