TypeScript 工具类型Required如何工作?

在 TypeScript 中,我们有时需要强制一个对象具有必需的属性,即使原始类型将其中一些定义为可选的。为此,TypeScript 有一个名为Required. 让我们看看它是如何工作的。

TypeScript 所需的实用程序类型#

默认情况下,如果我们在 TypeScript 中定义一个新类型,该类型中的所有字段都是自动需要的:

type User = {
    firstName: string,
    lastName: string
}

let firstUser:User = {
    firstName: "John"
}

上面,firstUser是 type User,但它不见了lastName。因此,此代码返回错误:


Property 'lastName' is missing in type '{ firstName: string; }' but required in type 'User'.

如果我们期望一个字段是可选的,我们可以在我们的类型定义中添加一个问号到它的末尾。下面,我们lastName改写为可选lastName?

type User = {
    firstName: string,
    lastName?: string
}

let firstUser:User = {
    firstName: "John"
}

因此,此代码不会引发错误 -是可选的,因此不包含它lastName的事实很好。firstUser

强制 TypeScript 中需要可选类型

有时,我们有一种情况,大部分时间lastName是可选的,但在某些情况下,我们需要它来做某事。在这些情况下,我们可以使用实用程序类型Required。例如,如果我们想lastName被要求,即使它最初被定义为可选,我们可以写如下:

type User = {
    firstName: string,
    lastName?: string
}

let firstUser:User = {
    firstName: "John",
}

let secondUser:Required<User> = {
    firstName: "John"
}

在此示例中,secondUser引发错误:


Property 'lastName' is missing in type '{ firstName: string; }' but required in type 'Required<User>'

因此,既然我们已经使用Required了 ,我们必须添加lastName以避免错误:

type User = {
    firstName: string,
    lastName?: string
}

let secondUser:Required<User> = {
    firstName: "John",
    lastName: "Doe"
}

这可以为我们提供更大的灵活性,同时允许我们对应用程序中的某些功能强制执行字段要求。与其他实用程序类型一样,Required它旨在与接口或对象类型一起使用,就像User我们上面定义的类型一样。因此,它不适用于变量。不过,这并不重要,因为变量无论如何都不能有空值。