在 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