Установить глобальное объявление в vscode JavaScript

Я работаю над транспилером JavaScript, который, помимо прочего, также заменит определенные функции и переменные при сборке.

Например, следующий файл (./src/my-module.js):

defineModule("MyModule", function(exports) {
  return exports;
});

Будет скопировано и преобразовано в (./build/my-module.js):

(function(global, factory) {
  "use strict";
  if (typeof exports !== "undefined" && typeof module !== "undefined") module.exports.MyModule = factory(exports.MyModule || {});
  else factory(global.MyModule = {});
})(this, function(exports) {
  return exports;
});

Некоторые из этих функций также могут возвращать результат. В этом случае я хотел бы иметь возможность объявлять типы параметров и результат функции без использования require. Возможно ли иметь глобальное определение .d.ts в VSCode?

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

Я не уверен, правильно ли я понял. Это проект на машинописном языке? Если да, то как насчет добавления типов в конфиг paths в tsconfig.json? Дайте мне знать, если это то, что вы ищете, поэтому я подготовлю ответ с подробностями позже.

saulotoledo 21.07.2019 16:06

Итак, вы пытаетесь объявить тип defineModule, не определяя функцию (поскольку она будет встроена только транспилером, нигде нет фактической вызываемой функции)?

Bergi 21.07.2019 16:19

@saulotoledo, я работаю над транспилером, а это значит, что я работаю над проектом (совершенно не важно, если это JavaScript или TypeScript), который изменит содержимое файлов JavaScript. Было бы идеально иметь объявления в глобальном .d.ts файле где-нибудь, на который я могу ссылаться из всех своих проектов без необходимости использования оператора require.

nick zoum 21.07.2019 16:20
Поведение ключевого слова "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) для оценки ваших знаний,...
11
3
3 244
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете указать свой собственный путь к папке TypeScript в своем settings.json, где вы можете указать свои собственные lib.*.d.ts файлы, используя опцию typescript.tsdk.

{
  "typescript.tsdk": "node_modules/typescript/lib"
}

Пока я следовал вашим инструкциям и поместил свой .d.ts с другими .d.ts файлами машинописного текста, VSCode по-прежнему говорит, что тип defineModule — это any. Кроме того, VSCode пытался получить node_modules/typescript/lib, используя путь относительно текущей рабочей области вместо Roaming/npm/node_modules. Я временно исправил проблему, используя абсолютный путь, хотя был бы очень признателен, если бы вы также могли указать мне правильное направление для решения этой проблемы.

nick zoum 24.07.2019 09:32

Есть ли какие-либо дальнейшие действия, которые я должен сделать?

nick zoum 27.07.2019 02:16

Я думаю, что если бы у вас был глобально установлен typescript, вы могли бы обойти это, указав на глобально определенную установку TypeScript. Очевидно, что это создаст проблемы, если ваши проекты указывают на разные версии TypeScript.

mootrichard 27.07.2019 23:34

Все еще немного неясно, должен ли я создать новый файл (должен ли я объявлять его?) в каталоге lib или я должен использовать один из существующих файлов (какой?). Должен ли я использовать export или declare? Не могли бы вы показать пример экспорта функции defineModule?

nick zoum 30.07.2019 09:56

О, я подумал, что вы уже знаете, как создавать свои собственные файлы *.d.ts, и просто добавите их туда. Есть несколько примеров, которые показывают, как вы можете объявить и экспортировать туда в другом месте, хотя stackoverflow.com/questions/21247278/about-d-ts-in-typescript‌​t

mootrichard 30.07.2019 20:02

Я знаю, но простое размещение файла .d.ts в папке lib не сработало, поэтому я спрашиваю, нужно ли мне включать папку, например, typescripts package.json или что-то в этом роде.

nick zoum 30.07.2019 20:11

Плохо, если немного углубиться в это, соглашение об именах для создания собственного определения библиотеки — lib.*.d.ts (обновлено в ответе). Если вы хотите сделать что-то немного хакерское, вы можете просто добавить их в typescript.d.ts в этой папке.

mootrichard 31.07.2019 20:41

Решил, что просто положу материал на typescript.d.ts. Но чтобы получить к нему доступ, я должен сделать require("C:\\Users\\...\\AppData\\Roaming\\npm\\node_modules‌​\\typescript\\lib\\t‌​ypescript"). Это не очень удобно.

nick zoum 01.08.2019 09:12
Ответ принят как подходящий

Подтверждение

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

Решение

Если вы нажмете F12 в глобальной функции JavaScript (например, eval), появится файл объявлений ввода (lib.es5.d.ts), содержащий документацию по JavaScript. Вы можете просто добавить в этот файл любые дополнительные пространства имен или функции. Но вам нужно использовать declare, а не export.

Пример:

//... Other Global JavaScript Declarations

// JavaScript Number Interface
interface Number {
  //...
}

// JavaScript Date Interface
interface Date {
  //...
}

declare function ezDefine(moduleName: string, generator: *): void;

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