I am returning Immutable.js List data structure from function.
PHPStorm is automatically attaching following 
@returns {*|List<T>|List<any>}. 
Eslint is giving me warning Unresolved variable of type 'T'. Where can I find documentation to annotations for Immutable.js?
How can I describe in @returns annotation shape of the List that would pass in Eslint?
/**
 * @param n
 * @returns {*|List<T>|List<any>}
 */
const getList = (n) => {
  let list = Immutable.List()
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      list = list.push(Immutable.List.of(i, j))
    }
  }
  return list
}
                Although I am not familiar with Immutable.js, the problem is that T is a template that must be defined in your documentation. See, what your function is really returning is a List of List of numbers. So T resolves to List<Number> and your fixed documentation would be something like:
/**
 * @param {Number} n
 * @return {List<List<Number>>}
 */
And you can just get rid of * and List<any> as possible return types, since your function is clearly always returning a list of list of numbers.
And that's it.
On a side note, please bear in mind that you wrote a function whose processing time increases quadratically with the parameter n. If you find yourself frequently calling the function passing the same value, consider memoizing its return value:
const memoizedLists = new Map();
/**
 * @param {Number} n
 * @return {List<List<Number>>}
 */
function getList(n) {
    // try to find a previous run for this same value
    let result = memoizedLists.get(n);
    if (!result) {
        // compute it otherwise
        result = Immutable.List();
        for (let i = 0; i < n; i++) {
            for (let j = 0; j < n; j++) {
                result.push(Immutable.List.of(i, j));
            }
        }
        // memoize it for a future invocation
        memoizedLists.set(n, result);
    }
    return result;
}
Moreover, not only time but memory use is also increasing quadratically. Depending on how you're using it, you probably want to make your function into a generator function instead, which will "magically" make it use constant space, i.e., no matter how big n gets, your function will continue to use just the same amount of memory. Here's your function turned into a generator function:
/**
 * @generator
 * @param {Number} n
 * @yields {List<Number>}
 */
function *getList(n) {
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            yield Immutable.List.of(i, j);
        }
    }
}
To be able to use it as a generator, you need to call it on demand. For instance, if you're printing those pairs of numbers to some output:
for (const pair of getList(4)) {
    console.info(`...and here comes another pair: [${pair}]`);
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With