我不确定是否误解了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'>
的类型,但事实并非如此。
答案 0 :(得分:1)
Exclude
从联合中删除了一种类型。因此,例如Exclude<'a' | 'b', 'b'>
将是a
。它不会从类型中删除属性。
通常从另一种类型中删除属性的类型称为Omit
。 Omit
将包含在3.5中,但是很容易根据Pick
和Exclude
进行定义(实际上是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';
}