Странная ошибка присваивания jsLint при приведении - PullRequest
2 голосов
/ 14 мая 2019

Я использую компилятор google-closure и инструмент jsLint для своего кода JS. Поскольку компилятор закрытия рассматривает теги JSDoc, мне нужно привести переменную к нужному типу, иначе компилятор выдаст ошибки. Код ниже работает нормально (без предупреждений компилятора), но когда я запускаю jsLint, я получаю ошибку «Странное назначение». Есть ли другой способ приведения переменной.

/** @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 Ответ

0 голосов
/ 15 мая 2019

Я хотел бы представить вам несколько мыслей;

1) Из Написание отказоустойчивых компонентов / # marie-kondo-your-lint-config :

Вот что я предлагаю вам сделать в понедельник.Соберите свою команду на полчаса, просмотрите каждое правило lint, включенное в конфигурации вашего проекта, и спросите себя: «Помогло ли это правило когда-нибудь помочь нам поймать ошибку?» Если нет, отключите ее.

2) Компилятор Closure не имеет проблем с вашим кодом.

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) Lint с ES-lint + jsdocs-plugin .

...