嗯,我想问题是
keyof ({a: string} | undefined)
显示为
never
所以只要财产是可选的,
DeepMerge
不能再向下移动了。可能还有其他方法可以解决这个问题,但是对于第一次拍摄,如何改变
T
和
U
到
NonNullable
他们自己的版本,其中
不可空的
是
defined in the standard library
作为
type NonNullable<T> = T extends null | undefined ? never : T;
让我们试试看:
type DeepMerge<_T, _U, T= NonNullable<_T>, U= NonNullable<_U>> =
[T, U] extends [object, object] ?
{
[K in keyof (U & Pick<T, Exclude<keyof T, keyof U>>)]: (
K extends keyof U ? (
K extends keyof T ? DeepMerge<T[K], U[K]> : U[K]
) : (
K extends keyof T ? T[K] : never
)
)
} : U;
这行吗?推断出
person
作为
const person: {
address: {
pizzaDelivery: boolean;
address?: {
burger: boolean;
line1: string;
line2: string | number | null;
zip: string | number;
} | undefined;
line1: string;
line2: string | number | null;
zip: string | number;
};
name: string;
age: number;
}
编辑:你想要的也可能是
distribute across all unions
,像这样:
type DeepMerge<T, U> = T extends any ? U extends any ?
[T, U] extends [object, object] ?
{
[K in keyof (U & Pick<T, Exclude<keyof T, keyof U>>)]: (
K extends keyof U ? (
K extends keyof T ? DeepMerge<T[K], U[K]> : U[K]
) : (
K extends keyof T ? T[K] : never
)
)
} : U : never : never;
也许这对你更好?
希望有帮助。祝你好运!