在TypeScript中定义Partial <t>的逆

时间:2019-03-04 12:17:28

标签: typescript

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。不幸的是,这不起作用-可选属性仍然是可选的。在某些情况下,打字稿似乎以某种方式保留了keyof类型的属性名称的要求信息。

有趣的是,如果将该类型存储在中间类型名称中,则会删除该信息。即这有效:

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的定义中,它又是可选的。

我希望这是一个单一的,易于使用的类型,并且由于我不知道用于定义本地类型的类型声明的方法,因此该技巧似乎并没有太大帮助。

我有什么想念的招吗?

1 个答案:

答案 0 :(得分:5)

映射类型并非全部相同。同态映射类型保留映射类型的修饰符。从PR开始,介绍了此功能:

  

使用此PR,我们以同态(保留结构)映射类型保留属性修饰符。形式为{ [P in keyof T]: X }的映射类型与T同态(因为它具有与T相同的属性集),并且现在保留了可选和只读修饰符,因为它们存在于T

从2.8开始,您可以使用-(请参见PR)从此类类型中删除修饰符:

type Full<T> = {
  [P in keyof T]-?: T[P};
}

注意

您可以使用标准库中预定义的Required类型,该类型与Full完全相同。