根据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的定义中使用OmitExclude<keyof T, K>合并T的键并删除K指定的键。然后PickT提取其余属性。

编辑

虽然OmitExlcude都带有两个类型参数(并且两者之间没有强制关系),但是它们不能互换使用。查看这些类型的某些应用程序的结果:

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/

10-13 09:00