如何在 JSDoc 中指定类的类型(而不是其实例)

Ale*_*der 10 javascript jsdoc

我有课:

class Model { 
  static get schema() { }   // static property 'schema'
}
class CustomModel_1 extends Model { }
. . .
class CustomModel_N extends Model { }
Run Code Online (Sandbox Code Playgroud)

我想声明一个带有指定模型类型(不是此类型的实例)的参数的新函数:

/**
* @param {Model} ModelType  <== it is a wrong type because it is an instance of Model
*/
function doSomething(ModelType) {
  const schema = ModelType.schema // <== WebStorm emphasizes 'schema'
}
Run Code Online (Sandbox Code Playgroud)

我如何在 JSDoc 中指定它?表达式{Model}无效,因为它指定了模型的实例。

Dar*_*ren 8

您不妨尝试一下:

/**
 * @param {Model.constructor} ModelType
 */
function doSomething(ModelType) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

也就是说,您可以通过对象(本质上是类)的 constructor 属性来引用其构造函数,该属性是任何 JavaScript 对象的内置属性。

根据您的环境,您可能还想尝试以下操作:

/**
 * @param {typeof Model} ModelType
 */
Run Code Online (Sandbox Code Playgroud)

JSDoc 使用的闭包编译器支持此类型表达式,尽管我个人没有使用它,因为我的工具链的一部分不支持此特定语法。

另请参阅此JSDoc Typeof Plugin,这是最终在 VSCode 中为我工作的解决方案。

  • 最终我能够使用这个插件来满足 VSCode(及其 Intellisense Typescript Checker)和 jsdoc:https://www.npmjs.com/package/jsdoc-typeof-plugin,它将 {typeof Foo} 语法转换为 {Class &lt;Foo&gt;} 就像传递给 JSDoc 一样。 (2认同)