我正在尝试在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
答案 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>
答案 1 :(得分:1)
关闭。实际上是:
type DesiredType = Omit<Report, keyof IReport>