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