【问题标题】:Generic type that makes all possibly undefined properties optional使所有可能未定义的属性成为可选的通用类型
【发布时间】:2020-10-05 18:08:14
【问题描述】:

我想定义一个泛型类型,使给定类型的所有可能未定义的属性都是可选的。

例子:

type MyType = {
  a: number | undefined
  b: number
}

我正在寻找一个泛型类型

type OptionalUndefined<MyType>

这应该会导致

{
  a?: number | undefined
  b: number
}

我试过了,但它不起作用:

type OptionalUndefined<T> = {
  [P in keyof T]: T[P] extends undefined ? T[P] | never : T[P]
}

任何想法如何实现这一目标?

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    您需要将最终类型构造为具有可选属性的对象类型与包含其余属性的对象类型之间的交集。

    您可以使用与here 类似的方法过滤未定义的键。使用undefined 键,您可以从TPick 它们并使用Partial 使它们成为可选,以获取具有可选属性的对象类型。另一方面,您可以使用Omit 省略T 中的undefined 属性

    type MyType = {
      a: number | undefined
      b: number
    }
    
    
    type UndefinedKeys<T> = {
        [P in keyof T]: undefined extends T[P]  ? P: never
    }[keyof T]
    
    type OptionalUndefined<T> = Partial<Pick<T, UndefinedKeys<T>>> & Omit<T, UndefinedKeys<T>>
    type Id<T> = {} & { [P in keyof T] : T[P]}
    type X = Id<OptionalUndefined<MyType>>
    // type X = {
    //     a?: number | undefined;
    //     b: number;
    // }
    

    Playground Link

    注意:Id 用于展平生成的类型,虽然这不是必需的,但它有助于使类型更易于阅读。

    【讨论】:

    • 工作得很好,谢谢!扁平化是一个不错的技巧。但我认为它可以更简单地写成Id&lt;T&gt; = { [P in keyof T] : T[P]}
    • @Reducer 如果有效,别忘了标记为已回答 :)
    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多