【发布时间】: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