修改MongoDB导入的MapReduceOptions类型实现是否正确?
重写Mongoose MapReduceOptions类型的问题解答
一、实现正确性分析
你的代码存在两处关键问题,具体如下:
1. 泛型参数传递错误
TsOmitMapReduction的泛型定义与继承时的参数传递完全颠倒,且未正确关联目标泛型:
- 你定义
TsOmitMapReduction<TSchema extends Document, Key = ObjectId>,但继承时却传入TsOmitMapReduction<ObjectId, TSchema>,把Key和TSchema的顺序搞反了。 - 原
MapReduceOptions是带泛型的接口,但你在TsOmitMapReduction中使用时未传递泛型参数,导致它始终使用默认的MapReduceOptions<ObjectId, Document>,无法关联到你传入的TSchema类型。
正确的TsOmitMapReduction定义应该是:
export type TsOmitMapReduction<TSchema extends Document, Key = ObjectId> = Omit<MapReduceOptions<Key, TSchema>, "out" | "query" | "sort">
对应的TsMapReduceOptions继承时要传递正确的泛型顺序:
export interface TsMapReduceOptions<TSchema extends Document, Key = ObjectId> extends TsOmitMapReduction<TSchema, Key> { out?: MapReduceOutput; query?: TsFilter<TSchema>; sort: TsSort<TSchema>; };
2. 类型修改的合理性确认
- 你新增的
MapReduceOutput包含了string类型,这是原MapReduceOptions的out字段没有的类型。如果你的需求是允许直接传入集合名字符串(等价于{ replace: string }这类形式),这个修改是合理的,但要注意和原MongoDB驱动的类型兼容性。 - 你把原接口中可选的
sort字段改成了必填项,如果这是业务需求没问题,但如果需要兼容原有代码,建议保持可选(sort?: TsSort<TSchema>)。
二、Cmd+点击查看类型的内容翻译
假设你看到的英文类型展开内容为:
type TsOmitMapReduction<TSchema extends Document, Key = ObjectId> = CommandOperationOptions & { limit?: number | undefined; keeptemp?: boolean | undefined; finalize?: FinalizeFunction<Key, TSchema> | string | undefined; scope?: Document | undefined; jsMode?: boolean | undefined; verbose?: boolean | undefined; bypassDocumentValidation?: boolean | undefined; }
翻译为中文后的类型内容:
type TsOmitMapReduction<TSchema extends Document, Key = ObjectId> = CommandOperationOptions & { limit?: 数字 | 未定义; keeptemp?: 布尔值 | 未定义; finalize?: FinalizeFunction<Key, TSchema> | 字符串 | 未定义; scope?: Document | 未定义; jsMode?: 布尔值 | 未定义; verbose?: 布尔值 | 未定义; bypassDocumentValidation?: 布尔值 | 未定义; }
注:
CommandOperationOptions是MongoDB驱动内置的基础操作选项类型,包含超时、读写偏好等通用配置,展开后会显示其具体字段。
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

