Вот пример того, что я пытаюсь сделать.
Просто интересно, есть ли какой-нибудь способ добиться того, чтобы метод moo, на который ссылаются в других местах кода VS, заполнял intellisense с помощью jsdoc. Прямо сейчас это просто видно any.
библиотека/newmoment.js
/**
* @module lib/newmoment
*/
const moment = require('moment');
/**
* do the moo
* @returns {String} moo
*/
moment.moo = function(){
return 'moo'
}
module.exports = moment;
test.js, который использует lib/newmoment.js
const moment_modified = require('./lib/newmoment')
console.info(moment_modified.moo());
Скриншоты, показывающие any, однако я пытаюсь заставить интеллект показать do the moo:
оригинальная функция
Я нашел способ взломать то, что искал, без типа пересечения, используя JSdoc (ваш опыт может отличаться). Скриншоты с результатами ниже. Это, конечно, не самый чистый вариант, но, по крайней мере, он может помочь вам, пока у вас не появится возможность рефакторить код (см. предложения @adsy).
обновленный lib/newmoment.js
/**
* @namespace NewMoment
*/
const NewMoment = {
/**
* do the moo
* @returns {String} moo
*/
moo(){}
}
/**
* @type {NewMoment}
*/
const moment = require('moment');
moment.moo = function(){
return 'moo'
}
module.exports = moment;
test.js остается таким же, как и раньше



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Самый простой способ — использовать тип пересечения (&) исходного и нового типов. Object.assign уже подразумевает это, а также требует передачи литерала объекта для этого «нового типа».
В свою очередь, объектные литералы легко разметить с помощью дальнейшего JSDoc.
/**
* @module lib/newmoment
*/
const moment = require('moment');
module.exports = Object.assign(moment, {
/**
* do the moo
* @returns {String} moo
*/
moo() {
return 'moo';
}
});
Обратите внимание, что и этот, и ваш исходный пример фактически изменяют исходный модуль, что не является хорошей практикой. Вы можете использовать Object.assign({}, moment, { // ...etc.
Да. Если вы перешли на модуль ESM, вы все равно не сможете делать то, что делает этот код, поскольку они неизменяемы. В настоящее время он работает только потому, что использует старый синтаксис модуля commonjs.
Да, радости больших старых проектов. Я также хотел бы когда-нибудь перейти на ESM, но сегодня это неосуществимо из-за текущих зависимостей проекта и необходимости обширного рефакторинга кодовой базы. спасибо за советы, я постараюсь посмотреть, смогу ли я заставить тип пересечения хорошо работать с JSdoc и исходными функциями модуля. Было бы здорово иметь intellisense для некоторых функций, чтобы мне не приходилось вручную искать параметры функции.
понял - я хотел бы провести рефакторинг фактического кода, чтобы не изменять исходный модуль, чтобы он делал что-то вроде прокси или просто отдельный модуль целиком. Но для этого сначала требуется другой рефакторинг зависимостей.