在TypeScript中,
Required<T>
是一个内置的工具类型(Utility Type),用于将类型T
中的所有可选属性转换为必需属性。
1. 示例
ts
type Foo = {
a?: string
b?: number
c?: boolean
}
// 实现效果
type MyRequired<T> = {
[P in keyof T]-?: T[P];
}
const a: MyRequired<Foo> = {}
// Error
const b: MyRequired<Foo> = {
a: 'BFE.dev'
}
// Error
const c: MyRequired<Foo> = {
b: 123
}
// Error
const d: MyRequired<Foo> = {
b: 123,
c: true
}
// Error
const e: MyRequired<Foo> = {
a: 'BFE.dev',
b: 123,
c: true
}
// valid
在上面的示例中,关键在于使用TypeScript 2.8中引入的-
删除?
修饰符。
2. 拓展
- -修饰符
ts
type MutableRequired<T> = { -readonly [P in keyof T]-?: T[P] }; // Remove readonly and ?
代码执行效果:
-readonly [P in keyof T]
: 在这里,我们使用了-
符号来表示从属性中移除修饰符。在 TypeScript 中,-readonly
表示移除只读修饰符,从而使属性变为可变(可写)。-?: T[P]
: 使用了-?
语法来将原本的可选属性转换为必需属性。
通过将 -readonly
应用于属性,我们移除了只读修饰符,从而将类型 T
中的只读属性转换为可变(可写)的必需属性。
- +修饰符
ts
type ReadonlyPartial<T> = { +readonly [P in keyof T]+?: T[P] }; // Add readonly and ?
代码执行效果:
+readonly [P in keyof T]
: 在这里,我们使用了+readonly
来添加只读修饰符。这表示我们将属性设置为只读。+?: T[P]
: 使用了+?
语法来将原本的必需属性转换为可选属性。
通过将 +readonly
应用于属性,我们将类型 T
中的所有属性设置为只读属性,而通过 +?
将它们变为可选属性。