如何在JSDoc中复用对象作为类方法的参数类型?
解决构造函数动态Schema作为方法参数类型实现自动补全的问题
你的核心问题是想把构造函数传入的动态Schema对象,绑定为类方法的参数类型以获得自动补全。原来的JSDoc写法无效是因为schema是运行时动态值,无法直接作为静态类型使用,下面提供两种可行方案:
方案1:TypeScript泛型实现(推荐)
直接用TypeScript的泛型类,将Schema作为泛型参数绑定,实例化时自动推断类型,方法参数会同步匹配:
class Collection<Schema extends Record<string, new () => any>> { private schema: Schema; constructor(schema: Schema) { this.schema = schema; } // 将Schema中的构造函数类型转换为对应实例类型,并用Partial允许传部分字段 findOne(searchObj: Partial<{ [K in keyof Schema]: Schema[K] extends new () => infer T ? T : never }>) { // 业务逻辑实现 } } // 实例化时自动推断Schema类型 const userCollection = new Collection({ name: String, id: Number }); userCollection.findOne({ name: "AngelCMHxD" // 此处会自动补全name、id字段,类型分别为string、number });
方案2:纯JavaScript + JSDoc泛型实现
如果保持纯JS开发,可以用JSDoc的泛型语法来绑定类型:
/** * @template {Record<string, new () => any>} T * 泛型T限制为键值对是构造函数的对象 */ class Collection { /** * @param {T} schema 初始化的Schema对象 */ constructor(schema) { this.schema = schema; } /** * @param {Partial<{ [K in keyof T]: InstanceType<T[K]> }>} searchObj * 将T中每个构造函数类型转换为对应实例类型,允许传部分字段 */ findOne(searchObj) { // 业务逻辑实现 } } // 用@type指定当前实例的泛型参数 /** @type {Collection<{ name: typeof String, id: typeof Number }>} */ const userCollection = new Collection({ name: String, id: Number }); userCollection.findOne({ name: "AngelCMHxD" // 此处支持自动补全 });
关键原理
不管是TS还是JS+JSDoc,核心都是用泛型将构造函数传入的Schema静态类型化,把运行时的动态值映射成静态类型系统能识别的结构,从而让编辑器实现自动补全。
内容的提问来源于stack exchange,提问作者Angel -_-
相关产品推荐
相关产品推荐

