在 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
我们上面定义的类型一样。因此,它不适用于变量。不过,这并不重要,因为变量无论如何都不能有空值。