You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子类中为父类定义@template泛型类型?

解决JSDoc泛型继承时类型提示失效的问题

问题核心是你在子类中单独声明@template但没把泛型类型传递给父类,导致父类的TSchema泛型没有绑定到子类指定的类型,所以insertOne方法只能识别MongoDB自带的_id字段。

正确的实现步骤

  1. 父类正确声明泛型
    确保父类的@template和方法参数类型绑定正确:

    /**
     * @template TSchema, TRawDoc
     */
    class BaseFixture {
      /**
       * 插入单个文档
       * @param {mongodb.OptionalUnlessRequiredId<TSchema>} doc
       */
      insertOne(doc) {
        // 业务逻辑
      }
    }
    
  2. 子类通过@extends传递泛型参数
    子类不需要单独用@template声明TSchema,而是通过@extends将指定的类型传递给父类的泛型占位符:

    /**
     * @extends BaseFixture<{test: string}, any>
     */
    class ActionLog extends BaseFixture {
      // 子类自定义方法
    }
    

    这里第二个泛型any对应父类的TRawDoc,如果TRawDoc有默认类型或者你不需要自定义,可以根据实际情况替换。

  3. 验证类型提示
    现在调用ActionLog.insertOne({})时,编辑器应该会自动提示test字段,同时保留MongoDB的_id可选字段。

扩展:子类需要自定义泛型的情况

如果子类需要新增自己的泛型,同时继承父类的泛型,可以这样写:

/**
 * @template TExtraFields, TRawDoc
 * @extends BaseFixture<{test: string} & TExtraFields, TRawDoc>
 */
class ActionLog extends BaseFixture {
  // 子类逻辑
}

这样TExtraFields可以让使用者额外扩展字段,同时父类的TSchema会合并固定的test字段和自定义的TExtraFields。

内容的提问来源于stack exchange,提问作者Sammaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:27:07