如何在子类中为父类定义@template泛型类型?
解决JSDoc泛型继承时类型提示失效的问题
问题核心是你在子类中单独声明@template但没把泛型类型传递给父类,导致父类的TSchema泛型没有绑定到子类指定的类型,所以insertOne方法只能识别MongoDB自带的_id字段。
正确的实现步骤
父类正确声明泛型
确保父类的@template和方法参数类型绑定正确:/** * @template TSchema, TRawDoc */ class BaseFixture { /** * 插入单个文档 * @param {mongodb.OptionalUnlessRequiredId<TSchema>} doc */ insertOne(doc) { // 业务逻辑 } }子类通过
@extends传递泛型参数
子类不需要单独用@template声明TSchema,而是通过@extends将指定的类型传递给父类的泛型占位符:/** * @extends BaseFixture<{test: string}, any> */ class ActionLog extends BaseFixture { // 子类自定义方法 }这里第二个泛型
any对应父类的TRawDoc,如果TRawDoc有默认类型或者你不需要自定义,可以根据实际情况替换。验证类型提示
现在调用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
相关产品推荐
相关产品推荐

