在JSDoc中,有可能记录数组内容的确切类型like this:
/** @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并且未列出here,所以我想知道这个用例的语法是否适用于WebStorm或任何其他JS创作工具。
答案 0 :(得分:14)
您可以尝试使用@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将知道返回类型是字符串,因此将建议字符串完成选项等。
不确定这是否是您要找的内容......相关的帖子是here。
答案 1 :(得分:8)
与此同时,对此功能的支持已经完成,现在已记录在the Closure Compiler JSDOC page上。
基本上就是这样:
/**
* @constructor
* @template T
*/
Foo = function() { ... };
和
/** @return {T} */
Foo.prototype.get = function() { ... };
/** @param {T} t */
Foo.prototype.set = function(t) { ... };
不幸的是,在撰写本文时,WebStorm 7.0 does not support this feature (Vote for it!)尚未。
答案 2 :(得分: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(){}
...