扩展部分不包括排除的部分,将忽略排除的属性



我不确定我是否误解了Exclude的工作原理,但我有以下问题:

export interface Base {
    page: number;
    count: number;
}
export interface Sub extends Partial<Exclude<Base, 'count'>> { // error
    count?: 'nonzero'|'zero';
}

接口Sub导致错误,说Sub错误地扩展了接口Partial<Base>,但是这不是我所期望的。我期望Sub扩展了Partial<{ page: number }>,这是我认为是Exclude<Base, 'count'>的类型,但是情况似乎并非如此。

游乐场

Exclude从联合中删除了类型。因此,例如Exclude<'a' | 'b', 'b'>a。它不会从类型中删除属性。

通常,从其他类型中删除属性的类型称为OmitOmit将包含在3.5中,但用PickExclude来定义很容易定义(以下实际上是Omit的3.5定义(:

type Omit<T, K extends PropertyKey> = Pick<T, Exclude<keyof T, K>>
export interface Base {
    page: number;
    count: number;
}
export interface Sub extends Partial<Omit<Base, 'count'>> { // ok
    count?: 'nonzero'|'zero';
}

最新更新