用excludes扩展部分会忽略被排除的属性

时间:2019-05-23 10:52:04

标签: typescript

我不确定是否误解了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'>的类型,但事实并非如此。

Playground

1 个答案:

答案 0 :(得分:1)

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';
}
相关问题