仅黑白差异排除和忽略(拾取和排除)打字稿

时间:2019-07-06 18:09:09

标签: typescript

根据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>

1 个答案:

答案 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指定的键。然后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