打字稿:从类型中排除所有必需的属性

Posted

技术标签:

【中文标题】打字稿:从类型中排除所有必需的属性【英文标题】: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]

【问题讨论】:

【参考方案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 会潜入键中。可能在这里没有区别。

以上是关于打字稿:从类型中排除所有必需的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个从打字稿中的类中提取所有方法的类型?

如何在打字稿中避免这种符号“| undefined”?

打字稿,合并对象类型?

打字稿 |从对象 T 中提取具有类型 K 值的所有键名

具有命名属性和不同类型的任意命名索引属性的打字稿接口[重复]

Reactj,类型中缺少打字稿属性'setState'