【问题标题】:Typescript: Excluding all required properties from a type打字稿:从类型中排除所有必需的属性
【发布时间】:2019-08-15 16:21:42
【问题描述】:

如何在以下代码类型中定义 ExcludeAllRequiredProps<T> 以排除(如名称所示)所有必需的属性?提前致谢。

type A = {
  a: number,
  b: number,
  c?: number,
  d?: number
}

type B = ExcludeAllRequiredProps<A>


// B shall be { c?: number, d?: number }

[编辑 - 稍后]

您认为这是一个合适的解决方案吗?

type ExcludeAllRequiredProps<T> = {
  [K in keyof T]?: T extends Record<K, T[K]> ? never : T[K]
}

【问题讨论】:

    标签: typescript types typescript-typings typescript-types


    【解决方案1】:

    您的解决方案很接近,但它保留了那些额外的键,即使它们是never 类型,也可能导致混淆。此解决方案将从结果中删除不需要的键:

    type ExcludeAllRequiredProps<T> = Pick<T, {
        [K in keyof T]-?: T extends Record<K, T[K]> ? never : K
    }[keyof T]>
    
    type A = {
        a: number,
        b: number,
        c?: number,
        d?: number
    }
    
    type B = ExcludeAllRequiredProps<A> // { c?: number, d?: number }
    

    【讨论】:

    • 很好的解决方案,谢谢。一个问题:这是“-”吗?真的有必要吗?没有它我看不出有什么不同......
    • @Natasha 我出于习惯添加了它,有时在严格的空检查下,如果我们不使用 -? 并在其他地方出现问题,额外的 undefined 会潜入键中。可能在这里没有区别。
    猜你喜欢
    • 2021-11-01
    • 2019-02-25
    • 2019-03-29
    • 2023-02-06
    • 2020-09-14
    • 2019-01-05
    • 2019-12-02
    • 2018-12-16
    • 2021-02-25
    相关资源
    最近更新 更多