Итак, я знаю, что вопрос, вероятно, очень запутан, но в основном у меня есть файл в моем проекте узла, который при импорте одного из экспортов устанавливает значение переменной в глобальной области видимости в качестве получателя. В основном это означает, что вы можете вызывать одно и то же значение снова и снова и получать разные результаты. Например:
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.[имя переменной] и [имя переменной].
Вы можете использовать переменные среды.
@HamzaAnis Фактический вариант использования заключается в том, что вызов переменной автоматически вводит объект с параметрами, для которых установлено значение true, и хэш. Это используется моим модулем npm для последующей деконструкции объектных моделей и определения того, какие вложенные объекты являются объектами опций, а какие нет. Сравните что-то вроде const model = { user: {increment, type: 'string'}};
с const model = { user: { ...increment(), type: 'string'}}
. Я пытаюсь добиться синтаксиса в первом.
@CertainPerformance Спасибо за аналогичный вопрос (я понятия не имею, как вы, ребята, так легко их находите). Кроме того, с точки зрения того, чтобы не полагаться на глобальные свойства, есть ли другой способ добиться экспорта геттера/функции, замаскированного под переменную? Все, что я действительно пытаюсь сделать в конце дня, это создать переменную, которая меняет значение всякий раз, когда ее вызывают.
Я нашел это погуглив vscode augment global type javascript
, есть и другие связанные вопросы
@daviddavydov Вам действительно следует использовать для этого Symbol()
(по одному на модель), а не глобальную инкрементную переменную.
Когда вы работаете в модульной системе и пишете сценарий, вам обычно следует стараться работать в модульной системе, когда это возможно. Прибегайте к глобальному загрязнению только тогда, когда нет другого выхода.
Здесь вы можете выполнить то, что вам нужно, вернув геттер для экспортированного объекта (не глобального объекта):
let count = -1;
module.exports = {
get increment() {
count += 1;
return count;
}
};
const theIncrementModule = require('./magicIncrement');
console.info(theIncrementModule.increment);
console.info(theIncrementModule.increment);
Но такой код довольно сбивает с толку — при написании надежного, поддерживаемого кода вы не должны пытаться намеренно скрыть тот факт, что определенный геттер или доступ к свойству выполняет побочные эффекты (такие как увеличение переменной count
). Конечно, вы можете скрыть это за абстракциями, но не пытайтесь писать запутанный и хитрый код (например, иметь геттер для глобального объекта), чтобы скрыть это.
Может быть, что-то вроде stackoverflow.com/questions/46678663/…, но в большинстве случаев вам действительно не следует полагаться на нестандартные глобальные свойства в модульной системе.