根据Pick的定义,它仅为提到的属性构造一个新类型。
Exclude与之相反。
现在,我已经看到了用法
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
甚至在docs中也提到过。滚动到最后一个链接的最底部段落以查看。
现在,我还不太了解上面的用法。我们可以简单地使用
Exclude
来忽略非必需字段并构造它的新类型。为什么将组合的选择和排除用作Omit
?好博客的另一个例子
function removeName<Props extends ExtractName>(
props: Props
): Pick<Props, Exclude<keyof Props, keyof ExtractName>> {
const { name, ...rest } = props;
// do something with name...
return rest;
}
现在,上面的返回类型不能用
Exclude
重写为Exclude<Props, ExtractName>
最佳答案
您对Pick
是正确的,它采用对象类型并提取指定的属性。所以:
Pick<{ a: string, b:string }, 'a' > === { a: string }
相反,实际上是后来添加的
Omit
。此类型采用对象类型,并从该类型中删除指定的属性。 Omit<{ a: string, b:string }, 'a' > === { b: string }
Exclude
是另一种野兽,它采用联合类型并删除该联合的组成部分。Exclude<string | number, string > === number
Exclude
定义为:type Exclude<T, U> = T extends U ? never : T;
这意味着,如果
Exclude
扩展never
,则T
将返回U
,否则将返回T
。因此,这意味着:Exclude<string, number>
是string
Exclude<string, string>
是never
问题是条件类型distribute over naked type parameters。因此,这意味着如果将其应用于工会,我们将获得以下信息:
Exclude<string | number, number>
=> Exclude<string, number> | Exclude<number, number> // Exclude distributes over string | number
=> string | never => // each application of Exclude resolved to either T or never
=> string // never in unions melts away
在
Exclude
的定义中使用Omit
。 Exclude<keyof T, K>
合并T
的键并删除K
指定的键。然后Pick
从T
提取其余属性。编辑
虽然
Omit
和Exlcude
都带有两个类型参数(并且两者之间没有强制关系),但是它们不能互换使用。查看这些类型的某些应用程序的结果:type T0 = Omit<{ a: string, b: string }, "a"> // { b: string; }, a is removed
type T1 = Exclude<{ a: string, b: string }, "a"> // { a: string, b: string }, a does not extend { a: string, b: string } so Exclude does nothing
type T2 = Omit<string | number, string> //Atempts to remove all string keys (basically all keys) from string | number , we get {}
type T3 = Exclude<string | number, string> // string extends string so is removed from the union so we get number
关于typescript - 仅黑白差异排除和忽略(选择和排除) typescript ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56916532/