TypeScript具有Partial默认定义的类型,因此您可以说Partial<{x: number, y: string}>获得类似{x?: number, y?: string}的类型(类型的属性变为可选)。定义为
type Partial<T> = {
[P in keyof T]?: T[P]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试定义反函数,我们称之为Full<T>,以确保对象中的所有属性都是必需的。我从一个明显的定义开始:
type Full<T> = {
[P in keyof T]: T[P]
}
Run Code Online (Sandbox Code Playgroud)
只是Partial删除了问号。不幸的是,这不起作用-可选属性仍然是可选的。在某些情况下,打字稿似乎可以某种方式保留有关keyof类型中属性名称的要求的信息。
有趣的是,如果将该类型存储在中间类型名称中,则会删除该信息。即这有效:
type Config = {foo: number, bar?: string}
type ConfigKey = keyof Config
type FullConfig = {[K in ConfigKey]: Config[K]}
Run Code Online (Sandbox Code Playgroud)
在FullConfig(至少在TypeScript 3.3中)bar是必需的。但是,如果您内联keyof Config到的定义中FullConfig,则它又是可选的。
我希望这是一个单一的,易于使用的类型,并且由于我不知道用于定义本地类型的类型声明的方法,因此该技巧似乎并没有太大帮助。
有什么我想念的技巧吗?
Jon*_*kas 12
从 TypeScript 2.8 开始,我们现在有了Required<Type>实用程序 Type。
来自文档:
构造一个类型,其中包含设置为必需的 Type 的所有属性。与部分相反。
https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype
映射类型并非全部相同。同态映射类型保留映射类型的修饰符。从PR引入此功能:
通过此PR,我们可以将属性修饰符保留为同态(保留结构)映射类型。表单的映射类型
{ [P in keyof T]: X }与T相同(因为它具有与相同的属性集T),并且现在保留了可选和只读修饰符,因为它们存在于中的属性上T。
从2.8开始,您可以使用-(参见PR)从此类类型中删除修饰符:
type Full<T> = {
[P in keyof T]-?: T[P};
}
Run Code Online (Sandbox Code Playgroud)
注意
您可以使用Required标准库中的预定义类型,它与完全相同Full。
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |