Я прочитал, как работает разрешение модуля TypeScript .
У меня есть следующий репозиторий: @ ts-stack / di . После компиляции структура каталогов выглядит следующим образом:
├── dist
│ ├── annotations.d.ts
│ ├── annotations.js
│ ├── index.d.ts
│ ├── index.js
│ ├── injector.d.ts
│ ├── injector.js
│ ├── profiler.d.ts
│ ├── profiler.js
│ ├── providers.d.ts
│ ├── providers.js
│ ├── util.d.ts
│ └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│ ├── annotations.ts
│ ├── index.ts
│ ├── injector.ts
│ ├── profiler.ts
│ ├── providers.ts
│ └── util.ts
└── tsconfig.json
В моем package.json я написал "main": "dist/index.js"
.
В Node.js все отлично работает, но TypeScript:
import {Injector} from '@ts-stack/di';
Не удалось найти файл объявления для модуля '@ ts-stack / di'. '/path/to/node_modules/@ts-stack/di/dist/index.js' неявно имеет тип 'any'.
И все же, если я импортирую следующим образом, то все работает:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Что я делаю не так?
typescript
node-modules
ktretyak
источник
источник
npm install @types/node --save-dev
require
вместоimport
- это немного против паттерна: лучше объявить модуль в.d.ts
файле; см. мой ответ ниже.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Если вы импортируете сторонний модуль
'foo'
, который не предоставляет никаких типизаций, ни в самой библиотеке, ни в@types/foo
пакете (сгенерированном из репозитория DefiniteTyped ), то вы можете устранить эту ошибку, объявив модуль в файл с.d.ts
расширением. TypeScript ищет.d.ts
файлы в тех же местах, что и обычные.ts
файлы: как указано в «files», «include» и «exclude» вtsconfig.json
.Тогда, когда вы импортируете,
foo
он будет просто напечатан какany
.В качестве альтернативы, если вы хотите бросить свой собственный набор текста, вы можете сделать это тоже:
Тогда это будет правильно скомпилировано:
Вам не нужно предоставлять полную типографию для модуля, достаточно для тех битов, которые вы на самом деле используете (и вам нужны правильные типизации), поэтому это особенно легко сделать, если вы используете довольно небольшое количество API.
С другой стороны, если вы не заботитесь о типах внешних библиотек и хотите, чтобы все библиотеки без типизаций импортировались как
any
, вы можете добавить это в файл с.d.ts
расширением:Преимущество (и недостаток) в том, что вы можете импортировать абсолютно все, и TS будет компилироваться.
источник
d.ts
файлы? Вы должны предоставить какие-либо настройки, такие какtypeRoots
?.d.ts
файлы в тех же местах, что и обычные.ts
файлы: как указано «files», «include» и «exclude» вtsconfig.json
. Я не рекомендовал бы использоватьtypeRoots
для этой цели: это предназначено для расположения модулей внешнего типа (то естьnode_modules/@types
), а не отдельных.d.ts
файлов..d.ts
файл?Если вам нужно быстрое исправление, просто добавьте это перед строкой импорта:
источник
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Это чувство , когда вы смотрите в течение двух дней , и найти его , как это: просто удалить
.js
из"main": "dist/index.js"
вpackage.json
и все работает отлично!UPD : этот ответ относительно, если у вас есть собственный пакет npm, если нет - см. Мой ответ ниже .
И если ответ выше не решен импортировать ваш модуль, попробуйте просто добавить
typings
вpackage.json
:Конечно, здесь папка
dist
- это место, где хранятся файлы вашего модуля.источник
declare module "moduleName"
в это времяTypeScript в основном реализует правила и добавляет типы в ваш код, чтобы сделать его более понятным и точным из-за отсутствия ограничений в Javascript. TypeScript требует от вас описания ваших данных, чтобы компилятор мог проверить ваш код и найти ошибки. Компилятор сообщит вам, используете ли вы несовпадающие типы, выходите ли вы из области видимости или пытаетесь ли вы вернуть другой тип. Поэтому, когда вы используете внешние библиотеки и модули с TypeScript, они должны содержать файлы, описывающие типы в этом коде. Эти файлы называются файлами объявлений типов с расширением
d.ts
. Большинство типов объявлений для модулей npm уже написаны, и вы можете включить их, используяnpm install @types/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
(с соответствующим относительным путем к папкам) , чтобы машинопись знать , где он может найти типы определения библиотек и модулей и добавить новое свойство"exclude": ["../../node_modules", "../../typings"]
в файл. Вот пример того, как должен выглядеть ваш файл tsconfig.json:После этого ошибка исчезнет, и вы сможете придерживаться последних правил ES6 и TypeScript.
источник
index.d.ts
. Кроме этого, это было единственное решение, которое помогло мне.Для всех, кто читает это, попробуйте переименовать файл .js в .ts
Изменить: Вы также можете добавить
"allowJs": true
в свой файл tsconfig.источник
Этот способ работает для меня:
1. добавьте свою собственную декларацию в файл декларации, такой как index.d.ts (возможно, в корне проекта) 2. добавьте ваш index.d.ts в tsconfig.json- изменить: необходимые кавычки вокруг имени модуля
источник
У меня была та же проблема с использованием модуля узла с приложением реагирования, написанным на машинописи. Модуль был успешно установлен с помощью
npm i --save my-module
. Он написан на javascript и экспортируетClient
класс.С участием:
Компиляция завершается с ошибкой:
@types/my-module
не существует, поэтому я добавилmy-module.d.ts
файл рядом с тем, кудаmy-module
импортируется, с предложенной строкой. Я тогда получил ошибку:Клиент на самом деле экспортируется и работает нормально, если я использую его в приложении js. Кроме того, предыдущее сообщение говорит мне, что компилятор ищет нужный файл (
/node_modules/my-module/lib/index.js
определяется вmy-module/package.json
"main"
элементе).Я решил проблему, сказав компилятору, что меня не волнует неявное
any
, то есть я установилfalse
следующую строкуtsconfig.json
файла:источник
просто исправить это вы:
если вы хотите объявить интерфейс объекта (рекомендуется для большого проекта), вы можете использовать:
Как это использовать? просто..
источник
Я тоже это получал, какое-то время меня сбивало с толку, даже с уже установленным модулем и типами, и перезагрузкой моей IDE несколько раз.
В моем случае это исправляло завершение процессов терминала, удаление
node_modules
, очистку кэша диспетчера пакетов узла иinstall
повторную загрузку редактора.источник
К сожалению, не в наших руках, беспокоит ли создатель пакета файл объявления. Я склоняюсь к тому, чтобы иметь такой файл,
index.d.ts
который будет содержать все недостающие файлы объявлений из различных пакетов:Index.ts:
источник
Я перепробовал все здесь, но для меня это была совершенно другая проблема: мне пришлось удалить из моих
*.d.ts
операторов импорта:После удаления ошибка ушла ...
Пояснение : когда мы объявляем модуль в
*.d.ts
файле, он автоматически выбирается компилятором Typescript как окружающий модуль (тот, который вам не нужно явно импортировать). После того, как мы укажемimport ... from ...
, файл теперь станет обычным (ES6) модулем и, следовательно, не будет автоматически подхвачен. Следовательно, если вы все еще хотите, чтобы он работал как окружающий модуль, используйте другой стиль импорта, например:источник
Это то, что сработало от меня.
npm install --save readline
источник
Просто вы можете импортировать его, используя require как следующий код:
источник