CommonType<T, R>:T extends R ? R extends T ? T : R : R extends Numeric ? T extends Bool8 ? CommonType_Bool8<R> : T extends Int8 ? CommonType_Int8<R> : T extends Int16 ? CommonType_Int16<R> : T extends Int32 ? CommonType_Int32<R> : T extends Int64 ? CommonType_Int64<R> : T extends Uint8 ? CommonType_Uint8<R> : T extends Uint16 ? CommonType_Uint16<R> : T extends Uint32 ? CommonType_Uint32<R> : T extends Uint64 ? CommonType_Uint64<R> : T extends Float32 ? CommonType_Float32<R> : T extends Float64 ? CommonType_Float64<R> : never : T extends List ? R extends List ? List<CommonType<T["valueType"], R["valueType"]>> : never : T extends Struct ? R extends Struct ? Struct<CommonTypes<T["dataTypes"], R["dataTypes"]>> : never : T extends Categorical ? R extends Categorical ? Categorical<CommonType<T["dictionary"], R["dictionary"]>> : never : never
CommonTypes<T, R>:{[ P in keyof T]: P extends keyof R ? CommonType<T[P], R[P]> : T[P]} & {[ P in keyof R]: P extends keyof T ? CommonType<R[P], T[P]> : R[P]}