TypeScript Extract类型的工作原理

utility类型允许我们检查特定成员的union类型,并根据剩余的内容返回新类型。它在格式上与“排除”类型非常相似Extract

让我们来看看它是如何工作的。

Utility类型

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

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

在TypeScript中,我们可以定义一个称为union类型的特定类型。union类型是某物的可能值的列表。下面显示了一个示例,其中类型均值变量和其他输出只能是以下四个值之一:?、 ? 或 ? ?myUnionType

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

// This works since ? is a member of "?" | "?" | "?" | "?"
let myFirstVariable:myUnionType = "?"

// This doesn't work since "my-string" is NOT member of "?" | "?" | "?" | "?"
let mySecondVariable:myUnionType = "my-string"

Extract类型

如果我们想从union类型中删除特定元素,我们可以使用exclude类型 – 但还有其他方法可以操作union 类型。

Type允许我们定义一个新列表,如果该列表中的任何项存在于我们的原始类型中,则返回一个新类型。Extract

让我们看一个简单的例子:

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

let myFirstVariable:Extract<myUnionType, "?" | "?"> = "?"
//  ^
//  └ - - Type is "?" | "?"

当我们写 时,检查 。如果它们存在,它将创建一个包含现有项的新类型。由于 两者都? ?存在于我们的union类型中,因此我们最终会得到一个新类型 – 。ExtractExtractmyUnionType"?" | "?""?" | "?"

如果我们在语句中定义了在原始union类型中不存在的成员,那么在新类型中将忽略它们。例如:Extract

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

let myFirstVariable:Extract<myUnionType, "?" | "?" | "?"> = "?"
//  ^
//  └ - - Type is STILL "?" | "?" since "?" is not in myUnionType

使用不会影响原始类型,因此我们仍然可以根据需要使用它:Extract

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

let myFirstVariable:Extract<myUnionType, "?" | "?" | "?"> = "?"
//  ^
//  └ - - Type is "?" | "?"

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

因此,当我们想要将original原始union类型限制为特定变量或输出的一组定义成员数时,Extract 是一个很好的工具。它为我们提供了灵活性,让我们可以动态定义类型,我们可以在代码中的任何位置使用这些类型。