投射时jsLint奇怪的分配错误

jsLint weird assignment error when casting

我对我的 JS 代码使用 google-闭包编译器和 jsLint 工具。因为闭包编译器查看 JSDoc 标签,所以我需要将变量转换为正确的类型,否则编译器会抛出错误。下面的代码工作正常(没有编译器警告),但是当我 运行 jsLint 我得到 'Weird assignment' 错误。还有其他方法可以转换变量吗?

/** @return {Town|Village|Park|Metropolis} */
var getCurrentItem = function() {...some code}

var item = getCurrentItem();

if (condition)
{
    item = /** @type {Town} */ (item);  // 'Weird assignment' error occurs

    drawTown(item);
    updateTown(item)
}
else
{
    item = /** @type {Village} */ (item);  // 'Weird assignment' error occurs

    drawVillage(item);
    updateVillage(item)
}

我希望在一行中完成转换,而不是在我需要调用的每个函数上完成!

我想为您提供一些想法;

1) 来自 Writing Resilient Components/#marie-kondo-your-lint-config

Here’s what I suggest you to do on Monday. Gather your team for half an hour, go through every lint rule enabled in your project’s config, and ask yourself: “Has this rule ever helped us catch a bug?” If not, turn it off.

2) Closure Compiler has no issue with your code.

3) 如果必须,只需施放两次:

drawVillage(/** @type {Village} */ (item));
updateVillage(/** @type {Village} */ (item));

4) 如果你真的很在意避免重复自己,你可以创建一个函数来为你做转换;

/** 
 * @param {Town|Village|Park|Metropolis} p
 * @return {boolean|Village}
 */
var getVillage = function(p) {
  if (p.somethingVillageSpecific) {
    return /** @type {Village} */ (p);
  } else {
    return false;
  } 
}

5) 使用 ES-lint + jsdocs-plugin 进行检查。