mongoose 使用推断提取原始Typegoose文档的类型给出未知

i7uq4tfw  于 2023-06-30  发布在  Go
关注(0)|答案(1)|浏览(129)

我已经创建了一个codesandbox,以便于试用。但下面也是与我的问题更相关的部分。
这是期望提取原始Mongoose文档的类型的类型(它没有。):

// ⭐ class Document<T = any, TQueryHelpers = any, DocType = any>
type ObtainRawDocType<T> = T extends mongoose.Document<
  infer A,
  infer B,
  infer C
>
  ? C // <--- ⭐ Must return the raw document's type.
  : never;

这就是上面的泛型被使用的地方(为了测试上面的泛型,返回类型故意不正确。):

export function clearFields<
  T extends mongoose.Document,
  U extends PropertyKey[]
>(dataObj: T, privateFields: U): ObtainRawDocType<T> {

但是,这个cc1的类型被检测为unknown

const cc1 = clearFields(c1, ["birthdate"]);
yjghlzjz

yjghlzjz1#

typegoose discord上也提出了这个问题,我们得出的结论是,结果unknown是因为typescript丢弃了原始类型,如果它与Omit类型进行了AND,并且在结构上没有在任何地方使用。
问题的打印脚本操场示例
答案基本上是增加mongoose.Document类型,以便在结构上使用所需的泛型(在本例中,当前命名为DocType泛型(mongoose 7.3.1))

// NodeJS: 19.9.0
// MongoDB: 5.0 (Docker)
// Typescript 4.9.5
import { getModelForClass, prop } from '@typegoose/typegoose'; // @typegoose/typegoose@11.3.0
import * as mongoose from 'mongoose'; // mongoose@7.3.1

declare module 'mongoose' {
  interface Document<T = any, TQueryHelpers = any, DocType = any> {
    __DOCTYPE: DocType; // some kind of property to structurally use the generic
  }
}

type ObtainRawDocType<T> = T extends mongoose.Document<infer A, infer B, infer C> ? C : never;

function clearFields<T extends mongoose.Document, U extends PropertyKey[]>(dataObj: T, privateFields: U): ObtainRawDocType<T> {
  return undefined as any; // Temporary
}

class User {
  @prop()
  public username?: string;
}

const UserModel = getModelForClass(User);

const c1 = new UserModel({});

const cc1 = clearFields(c1, ['birthdate']);

注意事项:

  • 必须在发生declare module "mongoose"的地方执行import "mongoose",否则整个mongoose模块/命名空间将被 * 覆盖 * 而不是 * 增强 *
  • 扩充类型的泛型必须与源代码保持同步,否则typescript将报告All declarations of 'Document' must have identical type parameters.ts(2428)

相关问题