我正在返回 Immutable.js List来自函数的数据结构。
PHPStorm 自动附加以下内容
@returns {*|List<T>|List<any>}
.
Eslint 给我警告“T”类型的未解析变量。 在哪里可以找到 Immutable.js 注释的文档?
如何在 Eslint 中传递的列表的 @returns 注释形状中进行描述?
/**
* @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
}
最佳答案
虽然我不熟悉 Immutable.js,但问题是 T
是必须在文档中定义的模板。看,你的函数真正返回的是一个数字列表列表。所以T
解析为 List<Number>
并且您的固定文档将类似于:
/**
* @param {Number} n
* @return {List<List<Number>>}
*/
你可以去掉 *
和 List<any>
作为可能的返回类型,因为您的函数显然总是返回数字列表的列表。
就是这样。
关于算法复杂度
附带说明,请记住您编写的函数的处理时间随参数 n
呈二次方增长。 .如果您发现自己经常调用传递相同值的函数,请考虑记住它的返回值:
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;
}
此外,不仅时间而且内存使用量也在呈二次方增长。根据您使用它的方式,您可能希望将您的函数变成一个生成器函数,这将“神奇地”使其使用常量空间,即,无论有多大 n
获取,您的函数将继续使用相同数量的内存。这是你的函数变成了生成器函数:
/**
* @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);
}
}
}
为了能够将其用作生成器,您需要按需调用它。例如,如果您将这些数字对打印到某些输出:
for (const pair of getList(4)) {
console.info(`...and here comes another pair: [${pair}]`);
}
关于javascript - 注释中带有 JSDoc 和 Immutable.js 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38309123/