typescript - 在 TypeScript 中定义 Partial<T> 的逆函数

标签 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删除了问号。不幸的是,这不起作用——可选属性仍然是可选的。在某些情况下, 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 with T (because it has the same set of properties as T) and now preserves the optional and readonly modifiers as they exist on the properties in T.

从 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/

相关文章:

typescript - 由于 TypeOrmModule 而在 Heroku 上构建的 NestJS 应用程序崩溃,没有准确的错误消息

javascript - 如何从类中排除 getter 以创建存储库?

JavaScript 程序利用其他语言的程序

angular - 如何在 Angular 7 中对 getCurrentNavigation().extras.state 进行单元测试

javascript - setTimeout() 函数的 TypeScript 装饰器

typescript - 推断回调参数的类型

javascript - 如何将流转换为 typescript 中的变量

javascript - 使用 Javascript 调整图像大小而不在 DOM 上渲染 Canvas

Typescript - 无法让 'import' 语句发挥作用

javascript - 无法在 typescript 中设置接口(interface)类型的属性