【问题标题】:TypeScript - remove all properties with particular typeTypeScript - 删除具有特定类型的所有属性
【发布时间】:2020-12-06 09:37:54
【问题描述】:

我有一个type,用于将T 中存在的密钥投影到U 中存在的公共密钥及其类型:

type IntersectByCommonKey<T, U, V = any> = {
  [K in keyof U]: K extends keyof T ?
  T[K] extends V ?
  U[K]
  : T[K] extends object ?
  IntersectByCommonKey<T[K], U[K], V>
  : T[K] extends object | undefined ?
  IntersectByCommonKey<T[K], U[K], V> | undefined
  : never
  : never
};

IntersectByCommonKey Playground Link

U 中每个键 K 的位置,如果 T 具有相同的键 K,并且如果 K extends V 的类型包括该键的形状,否则 never .

对于IntersectByCommonKey 返回的类型,我想删除每个具有never 类型的键,这意味着它也必须处理嵌套的Record 形状。

删除顶级键很容易:

type ExcludeKeysWithTypeOf<T, V> = {
  [K in keyof T]: Exclude<T[K], undefined> extends V ? never : K 
}[keyof T]

type Without<T, V> = Pick<T, ExcludeKeysWithTypeOf<T, V>>;

ExcludeKeysWithTypeOf Playground Link

但是,我正在努力为嵌套的 Records 实现相同的结果,有没有办法可以递归地删除类型为 never 的键?

【问题讨论】:

    标签: typescript typescript-generics mapped-types


    【解决方案1】:

    我们需要进行递归调用以进入嵌套记录类型。 这是一个示例解决方案:

    type Without<T, V, WithNevers = {
      [K in keyof T]: Exclude<T[K], undefined> extends V ? never 
      : (T[K] extends Record<string, unknown> ? Without<T[K], V> : T[K])
    }> = Pick<WithNevers, {
      [K in keyof WithNevers]: WithNevers[K] extends never ? never : K
    }[keyof WithNevers]>
    

    核心思想是当我们的T[K] 将具有Record 类型时,它会再次递归调用自身(Without 类型级函数)。整个类型将简化为想要的形式,其中每个嵌套对象都将删除我们想要的键。

    整个代码sn-p - the playground

    注意:我将 WithNevers 的计算移到了类型的参数列表中,以实现更好的可读性。我们也可以将其定义为单独的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多