42

JSDoc中,可以像这样记录数组内容的确切类型:

/** @param {Array.<MyClass>} myClasses An array of MyClass objects. */
TestClass.protoype.someMethod = function( myClasses ){
   myClasses[0].aMethodOnMyClass();
}

这使得像 WebStorm 这样的 IDE 中的代码完成实际上在[0].. 这适用于 Array 类型,但是我有自己的集合类型,我也想在其中使用此功能。问题是我找不到正确的语法(也许因为还没有)。我希望能够像这样声明我的班级:

/**
 * @typeparam {T} the type parameter
 * @constructor {Test2.<T>}
 * */
Test2 = function(){};

/**
 * @returns {T} a value of type T, where T is the generic type parameter of Test2
 */
Test2.prototype.getGenericValue = function(){}

此语法或功能不适用于我的 IDE 并且未在此处列出,因此我想知道是否有此用例的语法,无论是用于 WebStorm 还是任何其他 JS 创作工具。

4

3 回答 3

36

您可以尝试使用@template标签(Google Closure 库中使用的未记录标签 - 极其有限的泛型形式)。就像是:

/**   
 * Search an array for the first element that satisfies a given condition and   
 * return that element.   
 * @param {Array.<T>|goog.array.ArrayLike} arr Array or array   
 *     like object over which to iterate.   
 * @param {?function(this:S, T, number, ?) : boolean} f The function to call   
 *     for every element. This function takes 3 arguments (the element, the   
 *     index and the array) and should return a boolean.   
 * @param {S=} opt_obj An optional "this" context for the function.   
 * @return {T} The first array element that passes the test, or null if no   
 *     element is found.   
 * @template T,S   
 */  
goog.array.find = function(arr, f, opt_obj) {    
   var i = goog.array.findIndex(arr, f, opt_obj);    
   return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];  
}; 

WebStorm 使用此标记进行类型提示 - 即,如果我们在上面的示例中将字符串数组传递给 goog.array.find ,IDE 将知道返回类型是字符串,因此将建议字符串完成选项等。

不确定这是否是您要查找的内容...看起来相关的帖子在这里

于 2013-04-15T15:29:32.743 回答
33

与此同时,对这个特性的支持已经完成,现在在Closure Compiler JSDOC 页面上记录了 generics

基本上它对于 ES6 类的工作方式如下:

/** @template T */
class Foo {
  /** @return {T} */
  get() { ... };

  /** @param {T} t */
  set(t) { ... };
}

...对于 ES6 之前的代码,就像这样:

/**
 * @constructor
 * @template T
 */
Foo = function() { ... };

/** @return {T} */
Foo.prototype.get = function() { ... };

/** @param {T} t */
Foo.prototype.set = function(t) { ... };

WebStorm 7.0在编写原始答案时支持此功能,但截至今天(2019 年),所有 JetBrains IDE 都正确理解此语法。

于 2013-10-11T16:18:54.947 回答
0

以下代码在 WebStorm 8 中对我来说很好用。

/** @type {Array.<MyPair.<Event, Array.<Thought>>>} */
scope.pairs = [];

/**
 * @template TFirst, TSecond
 */
function MyPair(first, second){
    this.first = first;
    this.second = second;
}
/** @type {TFirst} */
MyPair.prototype.first = null;
/** @type {TSecond} */
MyPair.prototype.second = null;

...
function Event(){}
...
...
function Thought(){}
...
于 2014-09-16T08:50:06.727 回答