根据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>
答案 0 :(得分:1)
您对 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