TypeScript-删除具有特定类型的所有属性

TypeScript-删除具有特定类型的所有属性,typescript,typescript-generics,mapped-types,Typescript,Typescript Generics,Mapped Types,我有一个类型,用于将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

我有一个
类型
,用于将
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
};


然而,我正在努力为嵌套的
记录
s实现相同的结果,是否有一种方法可以递归地删除类型为
从不
的键?

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

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]>
type Without=Pick
核心思想是当我们的
T[K]
将具有记录类型时,它将递归地再次调用自身(
,而不使用
类型级别函数)。整个类型将简化为所需的形式,其中每个嵌套对象都将删除我们所需的键

整个代码片段-

注意:为了获得更好的可读性,我在类型的参数列表中移动了
with
的计算。我们还可以将其定义为单独类型

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]>