Параметры общего типа документа в JSDOC
В JSDoc существует возможность документировать точные типы содержимого массива следующим образом:
/** @param {Array.<MyClass>} myClasses An array of MyClass objects. */
TestClass.protoype.someMethod = function( myClasses ){
myClasses[0].aMethodOnMyClass();
}
Это делает завершение кода в среде IDE, например, WebStorm предоставляет правильную информацию о типе после [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 и не указан здесь, поэтому мне интересно, есть ли синтаксис для этого использования -case, либо для WebStorm, либо для любого другого инструмента создания JS.
Ответы
Ответ 1
Тем временем поддержка этой функции была завершена и теперь документирована на странице JSDOC компилятора Closure для обобщений.
В основном это работает так для классов 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) все IDE JetBrains правильно понимают этот синтаксис.
Ответ 2
Вы можете попробовать использовать тег @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 использует этот тег для типа hinting - то есть, если мы передадим массив строк в goog.array.find в примере выше, IDE будет знать, что тип возвращаемого значения является строкой, поэтому будут предложены варианты завершения строки и т.д.
Не уверен, что это то, что вы ищете... Сообщение, которое выглядит связанным, здесь.
Ответ 3
Следующий код отлично работает для меня в 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(){}
...