我不确定我是否误解了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
。它不会从类型中删除属性。
通常,从其他类型中删除属性的类型称为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';
}