在TypeScript中定义Partial <T>的逆

Mar*_*ijn 5 typescript

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


Tit*_*mir 6

映射类型并非全部相同。同态映射类型保留映射类型的修饰符。从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

  • 请注意,`Full&lt;T&gt;` 更好地称为 [`Required&lt;T&gt;`](https://github.com/Microsoft/TypeScript/blob/v3.2.2/lib/lib.es5.d.ts#L1418 -L1423) 来自标准库。 (7认同)