TypeScript 有一个 Partial
默认定义的类型,这样你就可以说 Partial<{x: number, y: string}>
得到类似 {x?: number, y?: string}
的类型(类型的属性变为可选)。它被定义为
type Partial<T> = {
[P in keyof T]?: T[P]
}
我正在尝试定义逆函数,我们称它为 Full<T>
,这确保对象中的所有属性都是必需的。我从明显的定义开始:
type Full<T> = {
[P in keyof T]: T[P]
}
这只是 Partial
删除了问号。不幸的是,这不起作用——可选属性仍然是可选的。在某些情况下, typescript 似乎以某种方式保留了有关 keyof
中属性名称必需性的信息。类型。
有趣的是,如果您将该类型存储在中间类型名称中,则该信息将被删除。 IE。这有效:
type Config = {foo: number, bar?: string}
type ConfigKey = keyof Config
type FullConfig = {[K in ConfigKey]: Config[K]}
在FullConfig
(至少使用 TypeScript 3.3),bar
是必须的。但是如果你内联 keyof Config
进入 FullConfig
的定义, 它又是可选的。
我希望它是一个单一的、易于使用的类型,而且由于我不知道类型声明定义本地类型的方法,所以这个 hack 似乎没有太大帮助。
我是否缺少任何技巧?
最佳答案
映射类型并非生而平等。同态映射类型保留映射类型的修饰符。来自pull request介绍此功能:
With this PR we preserve property modifiers in homomorphic (structure preserving) mapped types. A mapped type of the form
{ [P in keyof T]: X }
is homomorphic withT
(because it has the same set of properties asT
) and now preserves the optional and readonly modifiers as they exist on the properties inT
.
从 2.8 开始,您可以使用 -
从此类类型中删除修饰符(参见 PR):
type Full<T> = {
[P in keyof T]-?: T[P];
}
注意
您可以使用标准库中预定义的 Required
类型,它的功能与 Full
完全相同。
关于typescript - 在 TypeScript 中定义 Partial<T> 的逆函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54983096/