2013-04-15 4 views
7

In JSDoc besteht die Möglichkeit, die genauen Arten von Array-Inhalt like this zu dokumentieren: in IDEsDokument generische Typparameter in JSDOC

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

Dies macht Code-Vervollständigung wie WebStorm tatsächlich die richtige Art Informationen nach dem [0]. liefern. Das funktioniert gut für den Array-Typ, aber ich habe meine eigenen Sammlungstypen, wo ich diese Funktion ebenfalls nutzen möchte. Das Problem ist, dass ich die richtige Syntax nicht finden kann (vielleicht, weil es noch keine gibt). Ich würde gerne in der Lage sein, meine Klasse zu erklären, irgendwie wie folgt aus:

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

Diese Syntax oder Feature funktioniert nicht mit meinem IDE arbeiten und ist nicht here aufgeführt, so frage ich mich, ob es eine Syntax für diesen Einsatz- ist Fall, entweder für WebStorm oder ein anderes JS-Authoring-Tool.

Antwort

4

In der Zwischenzeit wurde die Unterstützung für diese Funktion abgeschlossen und ist nun unter the Closure Compiler JSDOC page dokumentiert.

Im Grunde ist es wie folgt aus:

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

und

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

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

Leider zum Zeitpunkt des Schreibens, WebStorm 7.0 does not support this feature (Vote for it!), noch nicht.

11

Sie können versuchen, @template Tag verwenden (undokumentierte Tag in Google Closure-Bibliothek verwendet - extrem begrenzte Form von Generika). Etwas wie:

/** 
* 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 verwendet diesen Tag für Type Hinting - dh wenn wir passieren Array von Strings in der Probe oben auf goog.array.find wird IDE wissen, dass Rückgabetyp String ist, so Optionen String Fertigstellung vorgeschlagen werden usw.

Nicht sicher, ob dies das ist, wonach Sie suchen ... Der Beitrag, der ähnlich aussieht, ist here.

+0

Danke, ich habe gerade diese aus mir aus [dieser YouTrack Ausgabe] (http://youtrack.jetbrains.com/issue/WEB- 1208) und [dieser Closure Compiler Changeset] (https://code.google.com/p/closure-compiler/source/detail?spec=svn64d22457ddca24b07370f711276a449273bd6330&r=0eb41cabc9ba5463e3a34ea2fd900a8dd54f2136). Gibt es dafür Unterstützung auf Klassenebene? Meine Tests zeigen an, dass dies nur für "lokale Funktionstyp-Parameter" funktioniert. – Sebastian

0

Der folgende Code funktioniert für mich in WebStorm feinen 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

Im obigen Beispiel wurde auch mit dem Event- und Thoughth-Objekt gearbeitet. –

+1

Ja, in der Zwischenzeit wurde eine Menge davon in WS8 implementiert, aber es gibt immer noch offene Probleme, die nur in WS9 behoben werden - siehe meine Antwort und die damit verbundenen Probleme. – Sebastian