TypeScript Exclude类型的工作原理

在 TypeScript 中,实用工具类型允许我们从已定义的utility类型中排除某些成员。这意味着我们可以采用现有类型,并在特定情况下从中删除项目。Exclude

让我们看一下exclude utility type在TypeScript中的工作原理。

Utility类型

Utility类型是在TypeScript 中定义的类型,用于解决特定问题。如果您不熟悉在 TypeScript 中定义自定义类型,请在此处阅读我有关定义自定义类型的指南

Exclude类型在TypeScript中的工作原理#

在TypeScript中,我们可以定义一个称为union类型的特定类型。union类型是某物的可能值的列表。例如:

type myUnionType = "?" | "?" | "?" | "?"

在上面,如果我们给某物一个类型,那么它只能是4个值:?,,?,?或?。例如:myUnionType

type myUnionType = "?" | "?" | "?" | "?"

// This works!
let myString:myUnionType = "?"

// This throws an error! "Type '"some-string"' is not assignable to type 'myUnionType'.
let secondString:myUnionType = "some-string"

所以现在我们已经介绍了union类型如何工作的基础知识,让我们来谈谈。Exclude

Exclude类型

假设我们有一个情况,我们想要使用 ,但我们不想包含在?有效的值列表中。这可能在现实生活中的 API 响应中发生 – 假设您有一个标准的 API 响应类型,但您希望在特定情况下从该 API 类型中删除字段。myUnionType

这就是我们可以使用的地方。 具有语法 。我们传入正常的union类型,然后在第二个参数中说出要从中删除哪些成员。ExcludeExcludeExclude<UnionType, ExcludedMembers>

让我们试试吧:

type myUnionType = "?" | "?" | "?" | "?"

// This works!
let lemon:myUnionType = "?"

// This throws an error! Type '"?"' is not assignable to type '"?" | "?" | "?"'.
let noLemonsPlease:Exclude<myUnionType, "?"> = "?"

第二个变量会引发错误,因为我们曾经从union 类型中删除?此特定变量。这意味着我们可以在其他地方正常使用该类型,然后在我们觉得使用 Exclude 时排除成员。noLemonsPleaseExclude

如果我们想删除多个成员,我们只需要用:|

type myUnionType = "?" | "?" | "?" | "?"

// This works!
let lemon:myUnionType = "?"
 
let noLemonsPlease:Exclude<myUnionType, "?"> = "?"
//  ^
//  └ - - Type is  "?" | "?" | "?"

let noApplesOrLemons:Exclude<myUnionType, "?" | "?"> = "?";
//  ^
//  └ - - Type is  "?" | "?"

let onlyRaspberries:Exclude<myUnionType, "?" | "?" | "?"> = "?";
//  ^
//  └ - - Type is  "?"

let backToLemons:myUnionType = "?"
//  ^
//  └ - - Type is  "?" | "?" | "?" | "?"

因此,该类型使我们能够灵活地在适合我们的时候删除特定的元素,并在我们再次需要它们时将它们保留在那里。Exclude