web-dev-qa-db-ja.com

JSDOCでジェネリック型パラメーターを文書化する

JSDoc には、配列の内容の正確なタイプを文書化する可能性があります このように

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

これにより、WebStormなどのIDEでのコード補完により、実際には[0].の後に正しい型情報が提供されます。これは配列型ではうまく機能しますが、この機能を利用したい独自のコレクション型もあります。問題は、正しい構文が見つからないことです(おそらく、まだ構文がないためです)。どういうわけか次のようにクラスを宣言できるようにしたいと思います。

/**
 * @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オーサリングツール。

18
Sebastian

その間に、この機能のサポートは最終決定され、現在、 ジェネリックスのクロージャーコンパイラJSDOCページ に文書化されています。

基本的に、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)現在、すべてのJetBrainsIDEはこの構文を正しく理解しています。

10
Sebastian

@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は戻り値の型が文字列であることがわかるため、文字列補完オプションは次のようになります。提案など.

これがあなたが探しているものであるかどうかわからない...関連しているように見える投稿は ここ です。

18
lena

次のコードは、WebStorm8で正常に機能します。

/** @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
SM Adnan