Не удалось найти файл объявления модуля

Обновлено: 02.07.2024

Я читаю, как работает разрешение модуля TypeScript.

У меня есть следующий репозиторий: ts-di. После компиляции структура каталогов выглядит следующим образом:

В моем пакете.json я написал "main": "dist/index.js" .

В Node.js все работает отлично, но TypeScript:

Не удалось найти файл декларации для модуля ts-di. '/path/to/node_modules/ts-di/dist/index.js' неявно имеет тип "any".

И все же, если я импортирую как следует, то все работает:

Что я делаю неправильно?

ОТВЕТЫ

Ответ 1

Это чувство, когда вы смотрите на два дня и находите это так: просто удалите .js из "main": "dist/index.js" в package.json , и все будет хорошо!

UPD: этот ответ относительный, если у вас есть собственный пакет npm, если нет - см. мой ответ ниже.

И если выше ответ не разрешен импорт вашего модуля, попробуйте просто добавить typings в package.json :

Конечно, вот папка dist - она ​​хранит ваши файлы модулей.

Ответ 2

Вот два других решения

Если модуль не ваш, попробуйте установить типы из @types :

Если вышеприведенные ошибки установки - попробуйте изменить операторы import чтобы они require :

Ответ 3

Если вы импортируете сторонний модуль 'foo' , который не предоставляет никаких типизаций, ни в самой библиотеке, ни в пакете @types/foo (сгенерированном из репозитория DefiniteTyped), вы можете заставить эту ошибку идти прочь, объявив модуль в файле с расширением .d.ts :

Затем, когда вы импортируете foo он будет просто напечатан как any .

В качестве альтернативы, если вы хотите свернуть свои собственные наборы, вы также можете сделать это:

Тогда это будет правильно скомпилировано:

Вам не нужно предоставлять полную типизацию для модуля, достаточно только для тех битов, которые вы фактически используете (и для которых нужны правильные типизации), поэтому это особенно легко сделать, если вы используете довольно небольшое количество API.

С другой стороны, если вас не волнует типизация внешних библиотек и вы хотите, чтобы все библиотеки без типизаций импортировались как any , вы можете добавить это в файл с расширением .d.ts :

Преимущество (и недостаток) в том, что вы можете импортировать абсолютно все, и TS будет компилироваться.

Ответ 4

Если вам нужно быстрое исправление, просто добавьте это перед импортом:

Ответ 5

TypeScript в основном реализует правила и добавляет типы в ваш код, чтобы сделать его более понятным и точным из-за отсутствия ограничений в Javascript. TypeScript требует, чтобы вы описали свои данные, чтобы компилятор мог проверить ваш код и найти ошибки. Компилятор сообщит вам, если вы используете несогласованные типы, если вы находитесь вне области действия или вы пытаетесь вернуть другой тип. Поэтому, когда вы используете внешние библиотеки и модули с помощью TypeScript, они должны содержать файлы, описывающие типы в этом коде. Эти файлы называются файлами декларации типа с расширением d.ts Большинство типов объявлений для модулей npm уже написаны, и вы можете включить их, используя npm install @types/module_name (где module_name - это имя модуля, типы которого вы хотите включить).

Тем не менее, существуют модули, которые не имеют определений типов, и чтобы ошибка исчезла и импортировала модуль с помощью import * as module_name from 'module-name' , создайте папку, typings в корне вашего проекта, внутри создайте новую папку с именем вашего модуля и в этой папке создайте файл module_name.d.ts и напишите declare module 'module_name' . После этого просто зайдите в файл tsconfig.json и добавьте "typeRoots": [ "../../typings", "../../node_modules/@types"] в compilerOptions (с соответствующим относительным путем к ваши папки), чтобы позволить TypeScript знать, где он может найти определения типов ваших библиотек и модулей и добавить новое свойство "exclude": ["../../node_modules", "../../typings"] в файл. Вот пример того, как должен выглядеть ваш файл tsconfig.json:

Делая это, ошибка исчезнет, и вы сможете придерживаться последних правил ES6 и TypeScript.

Ответ 6

У меня была та же проблема с использованием модуля узла с приложением реагирования, написанным на машинописи. Модуль был успешно установлен с помощью npm я --save my-module . Он написан на javascript и экспортирует класс Client .

Компиляция завершается с ошибкой:

@types/my-module не существует, поэтому я добавил файл my-module.d.ts рядом с файлом, в который импортируется my-module , с предложенной строкой. Я тогда получил ошибку:

Я решил проблему, указав компилятор я не заботиться о неявном any , то есть, я поставил в false следующую строку tsconfig.json файла:

Ответ 7

Этот способ работает для меня:

1. добавьте свою собственную декларацию в файл декларации, такой как index.d.ts (возможно, в корне проекта) 2. добавьте ваш index.d.ts в tsconfig.json

- редактировать: нужны кавычки вокруг имени модуля

Ответ 8

Я тоже это получал, на какое-то время я был сбит с толку, даже с уже установленным модулем и типами и перезагружал мою IDE несколько раз.

В моем случае это исправляло завершение процессов терминала, удаление node_modules , очистку кеша менеджера пакетов узлов и повторную install затем перезагрузку редактора.

Ответ 9

enter image description here

Я импортировал Button из реактивной кнопки, и он выдавал эту ошибку, как показано на рисунке:

Я делаю трюк. Я попал в папку node_modules/Reaction-native-button/и скопировал содержимое файла Button.js. Создайте новый файл с именем Button.d.ts и вставьте в него содержимое. Сохранил его и ошибка исчезла! Не знаю причину, но пока это ушло!

Ответ 10

У меня была такая же проблема, и я решил ее, обновив tsconfig.json compilerOptions следующим образом:

Ответ 11

Я решил эту проблему просто так:

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

Я читал, как TypeScript разрешение модуля строительство.

у меня есть следующие репозитории: ts-di. После компиляции структура каталогов выглядит следующим образом:

в моем пакете.json я написал "main": "dist/index.js" .

В Узел.js все работает нормально, но TypeScript:

не удалось найти файл объявления для модуля "ts-di". '/path / to / node_modules/ts-di/dist / index.js 'неявно имеет 'any' тип.

и все же, если я импортирую следующим образом, то все работает:

что я делаю не так?

еще два способа, когда модуль не твое - просто попробуйте установить его из @types :

или, если ошибка установки-попробуйте переписать import to require :

это чувство, когда вы смотрите в течение двух дней и найти его так: просто удалить .js С "main": "dist/index.js" на package.json и все работает отлично!

UPD: этот ответ относительный, если у вас есть собственный пакет npm, если нет-см. мой ответ ниже.

и если выше ответ не разрешен импорт модуля, попробуйте просто добавить typings на package.json :

конечно, здесь папка dist - это где магазины файлы вашего модуля.

если вы импортируете сторонний модуль 'foo' это не предоставляет никаких типизаций, ни в самой библиотеке, ни в @types/foo пакет (генерируется из DefinitelyTyped repository), то вы можете сделать эту ошибку уйти, объявив модуль в :

тогда при импорте foo он будет просто набран как any .

в качестве альтернативы, если вы хотите свернуть свои собственные типы, вы можете сделать это, тоже:

тогда это будет компилироваться правильно:

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

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

преимущество (и недостаток) этого заключается в том, что вы можете импортировать абсолютно все, и TS будет компилироваться.

TypeScript в основном реализует правила и добавляет типы в ваш код, чтобы сделать его более ясным и точным из-за отсутствия ограничений в Javascript. TypeScript требует от вас описания ваших данных, чтобы компилятор мог проверить ваш код и найти ошибки. Компилятор даст вам знать, если вы используете несоответствующие типы, если вы находитесь вне своей области или пытаетесь вернуть другой тип. Поэтому, когда вы используете внешние библиотеки и модули с TypeScript, они должны содержат файлы, описывающие типы в этом коде. Эти файлы называются объявление типа файлы с пристройкой d.ts . Большинство типов объявлений для модулей npm уже написаны, и вы можете включить их с помощью npm install @types/module_name (где module_name-имя модуля, типы которого вы хотите включить).

тем не менее, есть модули, которые не имеют своих определений типов и для того, чтобы сделать ошибку уйти и импортировать модуль с помощью import * as module_name from 'module-name' создать папка typings в корне вашего проекта, внутри создать новую папку с именем модуля и в этой папке создать и писать declare module 'module_name' . После этого просто зайдите в свой tsconfig.json файл и добавить "typeRoots": [ "../../typings", "../../node_modules/@types"] на compilerOptions (С правильным относительным путем к вашим папкам), чтобы TypeScript знал, где он может найти определения типов ваших библиотек и модулей и добавить новое свойство "exclude": ["../../node_modules", "../../typings"] в файл. Вот пример того, как ваш tsconfig.файл json должен выглядеть например:

сделав это, ошибка исчезнет, и вы сможете придерживаться последних правил ES6 и TypeScript.


У меня следующий репозиторий: @ ts-stack / di. После компиляции структура каталогов выглядит следующим образом:

В моем package.json я написал .

В Node.js все работает нормально, но TypeScript:

И все же, если импортировать так, то все работает:

Что я делаю неправильно?

  • У меня сработало удаление узловых модулей и их переустановка.

Вот два других решения

Когда модуль не ваш - попробуйте установить типы из :

Если вышеуказанные ошибки установки - попробуйте заменить операторы на :

Затем, когда вы импортируете , он будет набран как .

В качестве альтернативы, если вы хотите накрутить свои собственные наборы текста, вы тоже можете это сделать:

Тогда это будет правильно скомпилировано:

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

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

Преимущество (и обратная сторона) в том, что вы можете импортировать абсолютно все, а TS будет компилироваться.

Если вам нужно быстрое исправление, просто добавьте это перед строкой импорта:

  • 8 Спасибо, самый полезный ответ для моего случая.
  • 2 Это вызывает ошибку в более поздних версиях eslint:
  • 2 @Hykilpikonna Я считаю, что вы можете добавить / , чтобы отключить eslint, прежде чем использовать , а затем добавить после проблемной строки кода, чтобы повторно включить eslint для остальной части вашего файла.
  • 1 Я испробовал почти все методы. Только ты решишь мою проблему. Спасибо!

Это чувство, когда вы смотрите два дня и обнаруживаете это так: просто удалите из в , и все работает нормально!

UPD: этот ответ относительный, если у вас есть собственный пакет npm, если нет - см. мой ответ ниже.

И если ответ выше не решен, импортируйте ваш модуль, попробуйте просто добавить в :

Конечно же, здесь папка - здесь хранятся файлы вашего модуля.

TypeScript в основном реализует правила и добавляет типы в ваш код, чтобы сделать его более понятным и точным из-за отсутствия ограничений в Javascript. TypeScript требует, чтобы вы описали свои данные, чтобы компилятор мог проверить ваш код и найти ошибки. Компилятор сообщит вам, если вы используете несовпадающие типы, если вы выходите за пределы своей области действия или пытаетесь вернуть другой тип. Итак, когда вы используете внешние библиотеки и модули с TypeScript, они должны содержать файлы, описывающие типы в этом коде. Эти файлы называются файлы объявления типа с расширением . Большинство типов объявлений для модулей npm уже написаны, и вы можете включить их, используя (где имя_модуля - это имя модуля, типы которого вы хотите включить).

Однако есть модули, у которых нет определений типов, и чтобы устранить ошибку и импортировать модуль, используя , создайте папку в корне вашего проекта, внутри создайте новую папку с именем вашего модуля и в этой папке создайте файл и напишите . После этого просто перейдите в свой файл и добавьте в (с правильным относительным путем к вашим папкам), чтобы TypeScript знал, где он может найти определения типов ваших библиотек и modules и добавьте в файл новое свойство . Вот пример того, как должен выглядеть ваш файл tsconfig.json:

Таким образом, ошибка исчезнет, ​​и вы сможете придерживаться последних правил ES6 и TypeScript.

  • У меня это сработало, только если я назвал файл типизации . Помимо этого, это было единственное решение, которое сработало для меня.

Для всех, кто это читает, попробуйте переименовать ваш файл .js в .ts.

Изменить: вы также можете добавить в свой файл tsconfig.

Этот способ работает для меня:

1. добавьте свою декларацию в файл декларации, например index.d.ts (возможно, в корне проекта) 2. добавьте свой index.d.ts в tsconfig.json

- изменить: нужны кавычки вокруг имени модуля

У меня была такая же проблема с использованием модуля узла с приложением реакции, написанным на машинописном тексте. Модуль был успешно установлен с использованием . Он написан на javascript и экспортирует класс .

Сбой компиляции с ошибкой:

не существует, поэтому я добавил файл рядом с тем, куда импортируется , с предложенной строкой. Затем я получил ошибку:

Я решил проблему, сказав компилятору, что меня не волнует неявный , то есть я установил для следующей строки файла :

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

Вам нужно отредактировать файл конфигурации TypeScript (tsconfig.json) и добавить новую пару ключ-значение как:

К сожалению, не в наших руках, будет ли автор пакета возиться с файлом объявления. Я предпочитаю иметь файл , который будет содержать все недостающие файлы объявлений из различных пакетов:

Index.ts:

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

Что исправило это в моем случае, так это завершение процессов терминала, удаление , очистка кеша диспетчера пакетов узлов и выполнение нового , а затем повторная загрузка редактора.

если вы хотите объявить интерфейс объекта (рекомендуется для большого проекта), вы можете использовать:

Как это использовать? просто..

Я пробовал все здесь, но для меня это была совершенно другая проблема: мне пришлось удалить из моего все операторы импорта:

После удаления ошибка ушла .

Разъяснение: Когда мы объявляем модуль в файле , он автоматически выбирается компилятором Typescript как окружающий модуль (тот, который вам не нужно импортировать явно). После того, как мы укажем , файл станет обычным (ES6) модулем и, следовательно, не будет получен автоматически. Следовательно, если вы все еще хотите, чтобы он вел себя как окружающий модуль, используйте другой стиль импорта, например:

Помогло требование модуля, а не импорт .

Проверьте файл на предмет параметров компиляции и . Если он не существует, просто добавьте их, проинформировав корень каталог.

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

Я прочитал, как TypeScript разрешение модуля работает.

У меня есть следующий репозиторий: ts-di . После компиляции структура каталогов выглядит следующим образом:

В моем package.json я написал "main": "dist/index.js" .

В Node.js все отлично работает, но TypeScript:

Не удалось найти файл объявления для модуля 'ts-di'. «/path/to/node_modules/ts-di/dist/index.js» неявно имеет тип «любой».

И все же, если я импортирую следующим образом, то все работает:

Что я делаю неправильно?

Это чувство, когда вы наблюдаете два дня и находите это так: просто удалите .js из "main": "dist/index.js" в package.json и все работает отлично!

UPD: этот ответ относительно, если у вас есть собственный пакет npm, если нет - см. мой ответ ниже .

И если приведенный выше ответ не разрешен, импортируйте ваш модуль, попробуйте просто добавить typings в package.json :

Конечно, здесь папка dist - где хранятся файлы вашего модуля.

Еще два способа, когда модуль не ваш - просто попробуйте установить его из @types :

Или, если установка произошла с ошибкой - попробуйте переписать import в require :

Если вы импортируете сторонний модуль 'foo' , который не предоставляет никаких типизаций ни в самой библиотеке, ни в пакете @types/foo (сгенерированном из DefinitiveTyped repository), то вы можете устранить эту ошибку объявив модуль в файле .d.ts :

Затем, когда вы импортируете foo , он будет просто напечатан как any .

В качестве альтернативы, если вы хотите свернуть свои собственные наборы, вы также можете сделать это:

Тогда это будет правильно скомпилировано:

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

С другой стороны, если вас не волнует типизация внешних библиотек и вы хотите, чтобы все библиотеки без типизаций были импортированы как any , вы можете добавить это в файл .d.ts :

Преимущество (и недостаток) в том, что вы можете импортировать абсолютно все, и TS будет компилироваться.

TypeScript в основном реализует правила и добавляет типы в ваш код, чтобы сделать его более понятным и точным из-за отсутствия ограничений в Javascript. TypeScript требует от вас описания ваших данных, чтобы компилятор мог проверить ваш код и найти ошибки. Компилятор сообщит вам, используете ли вы несовпадающие типы, выходите ли вы за пределы области или пытаетесь вернуть другой тип . Поэтому, когда вы используете внешние библиотеки и модули с TypeScript, они должны содержать файлы которые описывают типы в этом коде. Эти файлы называются файлы объявлений типа с расширением d.ts . Большинство типов объявлений для модулей npm уже написаны, и вы можете включить их, используя npm install @types/module_name (где module_name - это имя модуля, типы которого вы хотите включить).

Тем не менее, существуют модули, которые не имеют определений их типов, и чтобы устранить ошибку и импортировать модуль с помощью import * as module_name from 'module-name' , создайте папку typings в корне вашего проекта, внутри создайте новую папку с именем вашего модуля и в этой папке создайте файл module_name.d.ts и напишите declare module 'module_name' . После этого просто перейдите к файлу tsconfig.json и добавьте "typeRoots": [ "../../typings", "../../node_modules/@types"] в compilerOptions (с правильным относительным путем к вашим папкам), чтобы дать TypeScript знать, где можно найти определения типов ваших библиотек и модулей, и добавьте новое свойство "exclude": ["../../node_modules", "../../typings"] в файл. Вот пример того, как должен выглядеть ваш файл tsconfig.json:

После этого ошибка исчезнет, ​​и вы сможете придерживаться последних правил ES6 и TypeScript.

Если вам нужно быстрое исправление, просто добавьте это перед импортом:

У меня была та же проблема с использованием модуля узла с приложением реагирования, написанным на TypeScript. Модуль был успешно установлен с использованием npm i --save my-module . Он написан на javascript и экспортирует класс Client .

Компиляция завершается с ошибкой:

@types/my-module не существует, поэтому я добавил файл my-module.d.ts рядом с файлом, в который импортируется my-module , с предложенной строкой. Я тогда получил ошибку:

Я решил проблему, сказав компилятору, что меня не волнует неявное any , то есть я установил false в следующей строке файла tsconfig.json :

Этот способ работает для меня:

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

В моем случае это исправило завершение процессов терминала, удаление node_modules , очистку кеша менеджера пакетов узлов и создание новой install , а затем перезагрузку редактора.

Читайте также: