Есть ли способ заставить IDE, такие как VSCode, распознавать глобальные переменные, которых еще не существует? (Узел)

Итак, я знаю, что вопрос, вероятно, очень запутан, но в основном у меня есть файл в моем проекте узла, который при импорте одного из экспортов устанавливает значение переменной в глобальной области видимости в качестве получателя. В основном это означает, что вы можете вызывать одно и то же значение снова и снова и получать разные результаты. Например:

magicIncrement.js:

let count = -1;

module.exports = {
  get magicIncrement() {
    Object.defineProperty(global, 'increment', { 
      get: () => {
        count += 1;
        return count;
      },
    });
  },
};

index.js:

let { magicIncrement } = require('./magicIncrement');

console.info( 'increment:', increment );
const test = increment;
console.info('"test"s value doesn\'t change.')
console.info('test:', test);
console.info('test:', test);
setTimeout(() => {
  console.info('...but "increment"s value always will')
  console.info( 'increment:', increment );
}, 1010);

В результате приращение будет увеличиваться каждый раз, когда вызывается переменная.

Проблема в том, что переменная не распознается IDE, поскольку технически «инкремент» не существует, насколько известно VSCode. Есть ли способ решить эту проблему?

P.S. Я попытался просто установить экспорт (в этом примере «магическое приращение») как имя глобальной переменной/геттера (в данном случае «приращение»), но это похоже на установку переменной в файле (например, путем разрушения, как это делается в индексе .js) просто обрывает связь между global.[имя переменной] и [имя переменной].

Может быть, что-то вроде stackoverflow.com/questions/46678663/…, но в большинстве случаев вам действительно не следует полагаться на нестандартные глобальные свойства в модульной системе.

CertainPerformance 23.12.2020 22:23

Вы можете использовать переменные среды.

Hamza Anis 23.12.2020 22:23

@HamzaAnis Фактический вариант использования заключается в том, что вызов переменной автоматически вводит объект с параметрами, для которых установлено значение true, и хэш. Это используется моим модулем npm для последующей деконструкции объектных моделей и определения того, какие вложенные объекты являются объектами опций, а какие нет. Сравните что-то вроде const model = { user: {increment, type: 'string'}}; с const model = { user: { ...increment(), type: 'string'}}. Я пытаюсь добиться синтаксиса в первом.

david davydov 23.12.2020 22:27

@CertainPerformance Спасибо за аналогичный вопрос (я понятия не имею, как вы, ребята, так легко их находите). Кроме того, с точки зрения того, чтобы не полагаться на глобальные свойства, есть ли другой способ добиться экспорта геттера/функции, замаскированного под переменную? Все, что я действительно пытаюсь сделать в конце дня, это создать переменную, которая меняет значение всякий раз, когда ее вызывают.

david davydov 23.12.2020 22:33

Я нашел это погуглив vscode augment global type javascript, есть и другие связанные вопросы

CertainPerformance 23.12.2020 22:42

@daviddavydov Вам действительно следует использовать для этого Symbol() (по одному на модель), а не глобальную инкрементную переменную.

Bergi 23.12.2020 22:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы работаете в модульной системе и пишете сценарий, вам обычно следует стараться работать в модульной системе, когда это возможно. Прибегайте к глобальному загрязнению только тогда, когда нет другого выхода.

Здесь вы можете выполнить то, что вам нужно, вернув геттер для экспортированного объекта (не глобального объекта):

let count = -1;
module.exports = {
  get increment() {
    count += 1;
    return count;
  }
};
const theIncrementModule = require('./magicIncrement');
console.info(theIncrementModule.increment);
console.info(theIncrementModule.increment);

Но такой код довольно сбивает с толку — при написании надежного, поддерживаемого кода вы не должны пытаться намеренно скрыть тот факт, что определенный геттер или доступ к свойству выполняет побочные эффекты (такие как увеличение переменной count). Конечно, вы можете скрыть это за абстракциями, но не пытайтесь писать запутанный и хитрый код (например, иметь геттер для глобального объекта), чтобы скрыть это.

Другие вопросы по теме