Я работаю над транспилером 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, чтобы не было ошибок.
Итак, вы пытаетесь объявить тип defineModule, не определяя функцию (поскольку она будет встроена только транспилером, нигде нет фактической вызываемой функции)?
@saulotoledo, я работаю над транспилером, а это значит, что я работаю над проектом (совершенно не важно, если это JavaScript или TypeScript), который изменит содержимое файлов JavaScript. Было бы идеально иметь объявления в глобальном .d.ts файле где-нибудь, на который я могу ссылаться из всех своих проектов без необходимости использования оператора require.



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


Вы можете указать свой собственный путь к папке 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. Я временно исправил проблему, используя абсолютный путь, хотя был бы очень признателен, если бы вы также могли указать мне правильное направление для решения этой проблемы.
Есть ли какие-либо дальнейшие действия, которые я должен сделать?
Я думаю, что если бы у вас был глобально установлен typescript, вы могли бы обойти это, указав на глобально определенную установку TypeScript. Очевидно, что это создаст проблемы, если ваши проекты указывают на разные версии TypeScript.
Все еще немного неясно, должен ли я создать новый файл (должен ли я объявлять его?) в каталоге lib или я должен использовать один из существующих файлов (какой?). Должен ли я использовать export или declare? Не могли бы вы показать пример экспорта функции defineModule?
О, я подумал, что вы уже знаете, как создавать свои собственные файлы *.d.ts, и просто добавите их туда. Есть несколько примеров, которые показывают, как вы можете объявить и экспортировать туда в другом месте, хотя stackoverflow.com/questions/21247278/about-d-ts-in-typescriptt
Я знаю, но простое размещение файла .d.ts в папке lib не сработало, поэтому я спрашиваю, нужно ли мне включать папку, например, typescripts package.json или что-то в этом роде.
Плохо, если немного углубиться в это, соглашение об именах для создания собственного определения библиотеки — lib.*.d.ts (обновлено в ответе). Если вы хотите сделать что-то немного хакерское, вы можете просто добавить их в typescript.d.ts в этой папке.
Решил, что просто положу материал на typescript.d.ts. Но чтобы получить к нему доступ, я должен сделать require("C:\\Users\\...\\AppData\\Roaming\\npm\\node_modules\\typescript\\lib\\typescript"). Это не очень удобно.
Этот ответ был в основном вдохновлен ответ Мутричарда, но, поскольку его пришлось изменить для работы с моим проектом, я также добавляю этот ответ.
Если вы нажмете 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;
Я не уверен, правильно ли я понял. Это проект на машинописном языке? Если да, то как насчет добавления типов в конфиг
pathsвtsconfig.json? Дайте мне знать, если это то, что вы ищете, поэтому я подготовлю ответ с подробностями позже.