2013-04-15 10 views
7

W JSDoc istnieje możliwość udokumentowania dokładnych typów zawartości tablicy like this:dokumentem JSDoc

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

To sprawia, uzupełniania kodu w IDE jak WebStorm rzeczywiście zapewniają odpowiednią informację o typie po [0].. Działa to dobrze dla typu Array, jednak mam własne typy kolekcji, w których chciałbym skorzystać z tej funkcji. Problem polega na tym, że nie mogę znaleźć właściwej składni (może dlatego, że jeszcze jej nie ma). Bardzo chciałbym, aby być w stanie zadeklarować moją klasę jakoś tak:

/** 
* @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(){} 

Ta składnia lub funkcja nie działa z moim IDE i nie ma na liście here, więc zastanawiam się, czy istnieje Składnia tego uży- teczność w przypadku WebStorm lub innego narzędzia do tworzenia JS.

Odpowiedz

4

W międzyczasie wsparcie dla tej funkcji zostało sfinalizowane i jest teraz udokumentowane na the Closure Compiler JSDOC page.

W zasadzie to jest tak:

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

i

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

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

Niestety w chwili pisania tego tekstu, WebStorm 7.0 does not support this feature (Vote for it!) jeszcze.

11

Możesz spróbować użyć tagu @template (nieudokumentowany tag używany w bibliotece Google Closure - bardzo ograniczona forma generycznych). Coś jak:

/** 
* 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 wykorzystuje ten tag na typ podpowiadania - czyli jeśli mijamy tablicę ciągów goog.array.find w powyższym przykładzie, IDE będzie wiedział, że typ zwracany jest ciąg znaków, więc opcje zakończenia STRING zasugerować itp.

Nie jestem pewien, czy to jest to, czego szukasz ... Post, który wygląda na powiązany, to here.

+0

Dzięki, właśnie się o tym sam z [tym YouTrack emisji] (http://youtrack.jetbrains.com/issue/WEB- 1208) i [ten zestaw zmian kompilacji zamknięcia] (https://code.google.com/p/closure-compiler/source/detail?spec=svn64d22457ddca24b07370f711276a449273bd6330&r=0eb41cabc9ba5463e3a34ea2fd900a8dd54f2136). Czy istnieje poparcie dla tego na poziomie klasy? Moje testy wskazują, że działa to tylko dla "funkcji lokalnych parametrów typu". – Sebastian

0

Poniższy kod działa dobrze dla mnie w 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(){} 
... 
+0

W powyższym przykładzie działał także z obiektem Event and Thought. –

+1

Tak, w międzyczasie wiele z tego zostało zaimplementowanych na WS8, ale wciąż są otwarte problemy, które zostaną naprawione tylko w WS9 - zobacz moją odpowiedź i powiązane problemy. – Sebastian