如何解决TypeScript-删除所有具有特定类型的属性
我有一个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],V> | undefined
: never
: never
};
IntersectByCommonKey Playground Link
K
中每个键U
的位置,如果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
但是,我正在努力为嵌套Record
获得相同的结果,有没有办法我可以递归地删除类型为never
的键?
解决方法
我们需要进行递归调用以进入嵌套记录类型。 这里是一个示例解决方案:
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
类型级别函数)。整个类型将简化为所需的形式,其中每个嵌套对象都将删除我们想要的键。
整个代码段-the playground
注意:为了获得更好的可读性,我将WithNevers
的计算移到了该类型的参数列表中。我们也可以将其定义为单独的类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。