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

Обновлено: 03.07.2024

Да, я могу создать файл "index.d.ts" и включить его туда, но на самом деле мне нужны типы. Например, я хочу знать, что возвращает MongoClient.connect.

Мы будем очень признательны за любую помощь в решении этой проблемы.

Сообщения без ответов

[Решено] Основная причина блокировки MySql — гибернация

  • Рутра
  • 9 минут назад
  • Ответов: 0

Рутра спрашивает: Основная причина блокировки MySql — спящий режим
У меня есть фрагмент кода в спящем режиме, структурированный, как показано ниже.

Этот метод является распространенным методом, и когда я использую две разные блокировки (в параллельном потоке), у меня возникает сценарий взаимоблокировки. Я пытаюсь понять основную причину мертвой блокировки.

[Решено] AttributeError: модуль «nmap» не имеет атрибута «PortScanner». (Пожалуйста, ПОМОГИТЕ!)

  • Стэнфорд Мартинес
  • 9 минут назад
  • Ответов: 0

Стэнфорд Мартинес спрашивает: AttributeError: модуль 'nmap' не имеет атрибута 'PortScanner'. (Пожалуйста, ПОМОГИТЕ!)
Это была действительно напряженная неделя для меня, ища ответы на то, как исправить эту проблему: 'AttributeError: модуль 'nmap' не имеет атрибута 'PortScanner'' для Python. Я хотел узнать больше о сканировании портов, но я даже не смог установить модуль в Visual Studio Code, который я использую. Я перепробовал все, что я и многие люди могли придумать:

  1. Удалил и переустановил python-nmap, а также просто nmap (поскольку они взаимосвязаны).
  2. Я пытался переименовать сам модуль.
  3. Я запускал свой код в разных IDE
  4. Я создал отдельную папку и поместил туда модули и свой проект.

Это мой код:

Пожалуйста, помогите мне с этим!!

Заранее спасибо.

[Решено] Загрузка представлений сервера sql с помощью мелтано

  • ашраяц
  • 9 минут назад
  • Ответов: 0

ashrayac Спрашивает: Загрузка представлений сервера sql с помощью Melano
В настоящее время выполняется перенос представлений с помощью Melano на AWS datalake. Плагины экстрактора и загрузчика работают хорошо и не имеют ошибок. Но он не может читать и находить представления, чтобы загрузить их в озеро данных. Буду рад любым отзывам о том, как представления загружаются/ссылаются на них.

формат именования представлений в Sql Server: schema.tabel-prd

В файле yml они находятся в разделе select/metadata:

[Решено] Как правильно загрузить модель с помощью Assimp?

  • Нор-с
  • 9 минут назад
  • Ответов: 0

Nor-s спрашивает: Как правильно загрузить модель с помощью Assimp?
Я пытаюсь загрузить модель с помощью assimp и OpenGL.

Но есть проблема с загрузкой модели здесь.

Некоторые модели нормально загружаются со следующими флагами:

Однако некоторые модели загружаются неправильно. Текстура испорчена.

img.jpg

Поэтому мне нужно перевернуть uv. Благодаря этому текстуры выглядят хорошо, но теперь модели, которые хорошо смотрелись спереди, выглядят странно.

img.jpg

Поэтому мне интересно, как правильно отразить это в коде. Есть ли способ узнать это?

[Решено] Symfony путает маршруты с параметрами

  • Энтони Родригес
  • 9 минут назад
  • Ответов: 0

Энтони Родригес спрашивает: Symfony путает маршруты с параметрами
Salvation,

Symfony путает два моих маршрута:

Я не знаю, как сказать Symfony различать их.

[Решено] Как активировать электронную почту для запуска задачи воздушного потока без emailOperator или пользовательского PythonOperator

  • Хилеш Чаухан
  • 9 минут назад
  • Ответов: 0

Хилеш Чаухан спрашивает: Как инициировать запуск электронной почты для задачи воздушного потока без emailOperator или пользовательского PythonOperator
У нас есть специальная группа обеспечения доступности баз данных воздушного потока, которую любой может запустить вручную из команды из 50+ человек. .

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

Существуют способы использования emailOperator или пользовательского PythoOperator, которые инициируют отправку электронной почты, но проблема заключается в том, что пользователь воздушного потока может пометить эту задачу как "успешную" и продолжить основную работу специальной DAG.

Но нам больше интересно узнать, можем ли мы получать электронную почту при запуске DAG ИЛИ в начале каждого запуска задачи, это поможет нам понять и отслеживать действия и использование/команды, выполняемые из adhoc DAG.

[Решено] Добавление числовых значений к сумме в указанной ячейке

  • Хуан Карлос
  • 9 минут назад
  • Ответов: 0

Хуан Карлос спрашивает: Добавить числовые значения к сумме в указанной ячейке
Я пытаюсь создать макрос в VBA-Excel, который позволяет мне генерировать простую сумму (используя знак +) в конкретной ячейке; сохраняя все числа в формуле ячейки. Я имею в виду, что мне нужно, чтобы формула вывода «удерживала» значения/формулы добавления, которые находятся в определенном диапазоне. Числа должны автоматически добавляться к формуле +. Особое ограничение состоит в том, что в случае отсутствия числа в ячейке диапазона формула не должна содержать «0».

Где A2: =5+2,5 и A5: =3-2 , Остальные просто числа Диапазон = A1:A7 Формула Вывод макроса на любую ячейку. Например, на B1 должно быть: =5 + 5 + 2,5 + 1 + 3 - 2 + 5,5 (20)

Псевдокод должен быть таким: для i = 1 (или диапазона) Cells(1, 2).FormulaLocal = если Cell(i,1) является числом (или существующей формулой сложения со значениями), добавить к текущему формула. если он пуст или равен 0, перейти к следующему i (или строке).

Вывод: формула "= Значение1(5) + формула2(5+2,5) + Skip0Value3() + Значение4(1) и т. д.

Мы будем признательны за любую помощь. Спасибо

Это работает только для положительных значений. Отрицательные значения добавляются к выходной формуле как "+-".

Выходная формула сохраняет только результаты исходной ячейки. Пример: A2 - это 5+2,5, добавлено как 7,5. Это должно быть разделено. То же самое с A5.

Можно ли в этом случае объявить переменную y как строку? любая другая оптимизация?

Может быть, есть совсем другой подход с лучшим и более быстрым результатом? Просто новичок в vba-excel

[Решено] Неверный синтаксис Discord

  • Не Року
  • 9 минут назад
  • Ответов: 0

Не Rhoku спрашивает: Недопустимый синтаксис Discord
Я пытаюсь создать селф-бота с поддержкой нескольких учетных записей.

Я получаю сообщение об ошибке компиляции

[Решено] Установка типа данных возвращаемой таблицы того же типа, что и в другой таблице

  • a693673
  • 9 минут назад
  • Ответов: 0

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

Когда я запускаю этот код, postgres жалуется, что first_name и last_name в возвращаемой таблице не соответствуют возвращаемому типу запроса. Это правда. Но как объявить first_name и last_name так, чтобы они соответствовали типу возвращаемого запроса или типу столбца базовой таблицы person_table без повторения одного и того же типа? Есть ли способ сказать что-то вроде:

ВОЗВРАЩАЕТ ТАБЛИЦУ(first_name TYPE is person_table.first_name, . ) ?

В Postgres есть функция "Нравится", но она выбирает все столбцы из заданной таблицы. Я хочу выбрать всего несколько из одной таблицы и несколько из другой. Моими решениями в прошлом было жесткое кодирование типа данных из базовой таблицы, поэтому varchar (150) или что-то в этом роде. Но я бы хотел, чтобы этот тип ссылался на другой тип, если это возможно.

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

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

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

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

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

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

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

31 Ответ 31

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

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

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

Если вы не можете найти имя, запустите это для TypeScript 2.0: npm install @types/node --save-dev

Я использую реактивный машинописный проект с YARN, требуется только работа. Спасибо. const yourModuleName = require('module-name');

@DanielKmak У меня тот же вопрос. Похоже, просто использование require вместо этого работает. Но к вашему сведению: существует репозиторий под названием DefinitelyTyped (упомянутый в другом ответе ниже), который может предоставлять типы, если то, что вы импортируете, достаточно популярно.

Если вы импортируете сторонний модуль foo, который не предоставляет типизации ни в самой библиотеке, ни в пакете @types/foo (созданный из репозитория DefinitelyTyped), вы можете сделать эту ошибку можно устранить, объявив модуль в файле с расширением .d.ts. TypeScript ищет файлы .d.ts в тех же местах, что и обычные файлы .ts: как указано в разделе «файлы», «включать» и «исключать» в tsconfig.json .

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

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

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

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

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

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

@Tom Он ищет файлы .d.ts в тех же местах, что и обычные файлы .ts: как указано «files», «include» и «exclude» в tsconfig.json . Я бы не рекомендовал использовать для этой цели typeRoots: он предназначен для расположения модулей внешних типов (т. е. node_modules/@types ), а не отдельных файлов .d.ts.

Для того, чтобы это работало, мне пришлось объявить модуль '. ' первая строка кода в файле module.d.ts и включает все импорты внутри блока модуля, а не перед ним. До того, как я это сделал, компилятор говорил, что не может найти модуль.

Будет ли объявление модуля '*' гарантировать, что компилируются только пакеты без типизации, или он будет мешать пакетам, которые вообще имеют типизацию?

Если вы получаете такую ​​ошибку при использовании ts-node , ознакомьтесь с документацией по ts-node Help! Мои типы отсутствуют!. Я потратил несколько часов, пытаясь выяснить, почему компилятор не видит мой .d.ts .

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

Это вызывает ошибку в более поздних версиях eslint: error Не используйте комментарии "// @ts-ignore", поскольку они подавляют ошибки компиляции @typescript-eslint/ban-ts-ignore

@Hykilpikonna Я считаю, что вы можете добавить / * eslint-disable */, чтобы отключить eslint перед использованием // @ts-ignore, а затем добавить /* eslint-enable */ после проблемной строки кода, чтобы снова включить eslint для остальной части вашего файла.

Для ситуации, когда вы устанавливаете собственный пакет npm

Если вы используете сторонний пакет, см. мой ответ ниже.

Удалить .js из "основного": "dist/index.js" в package.json .

Папка dist — это место, где компилятор TS хранит файлы вашего модуля.

Я немного мучился с этим: если у вас есть собственный пакет, обязательно удалите старое содержимое папки dist вашего пакета (или целых модулей node_modules в вашем проекте) и снова запустите сборщик. Даже после этого редактирования у меня все еще был старый index.js в dist, что вызвало предупреждение для меня.

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

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»] в параметрах компилятора (с правильным относительным путем к ваши папки), чтобы сообщить TypeScript, где он может найти определения типов ваших библиотек и модулей, и добавить новое свойство «исключить»: [»../../node_modules», «../../typings»] для файл. Вот пример того, как должен выглядеть ваш файл tsconfig.json:

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

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

После публикации этого блога мы запустили новую платформу автоматизации на основе событий. Наша платформа предлагает готовые средства автоматизации, называемые навыками , которые автоматизируют важные задачи, чтобы вы могли работать более продуктивно. Вы можете поддерживать чистоту своего кода TypeScript и обновлять зависимости с помощью Atomist Skills.

Когда я импортирую модуль JS, не созданный для TS, мне мешает компилятор. Там написано что-то вроде:

Как обойти эту ошибку?

Вот восемь исправлений, от худшего к лучшему:

TypeScript превратит ваш код в JavaScript даже при наличии ошибок компиляции.

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

Предостережение: параметр компилятора --noEmitOnError заставляет TypeScript отказываться от генерации JavaScript при обнаружении ошибок компиляции. Запустите tsc --noEmitOnError false, чтобы обойти это.

Предостережение: тесты могут блокироваться из-за ошибки. Это происходит со мной, потому что мой тест использует mocha, и мы запускаем mocha с компиляцией TypeScript на лету (наш тестовый скрипт npm запускает mocha --require espower-typescript/guess "test/**/*.test.ts" ) . Иногда mocha вылетает из-за этой ошибки, ничего не выводит и не возвращает ошибку, так что моя сборка выглядит успешной. 😡 Чтобы обойти это: скомпилируйте тест (допустив его сбой), затем запустите mocha на выходе JavaScript, например: $(npm bin)/mocha myParticularTest.test.js

В tsconfig.json в параметрах компилятора установите "noImplicitAny": false . Это заставит его замолчать.

Но тогда вы не получите ошибку, если забудете объявить тип параметра функции. Это плохо!

Внимание: случайное написание кода, похожего на functionsolveAThing(importantParameter) <. > назначит тип any важному параметру. Тогда у вас не будет проверки типа, и он не будет включен в рефакторинг своего типа. Это сжигало нас раньше. 🔥

Это на самом деле мой любимый, но мои коллеги не одобряют.

Создайте файл в любом месте среди ваших файлов .ts. Вставьте в него:

Вот и все, время вечеринки! Все модули, не типизированные иным образом, явно объявляются как any .

Некоторым людям нравится называть этот файл types.d.ts .

Иногда мне нравится называть его allowJavaScriptModules.ts . Это описывает его цель. Не похоже, чтобы этот файл содержал полезные типы.

Вы можете создать файл .d.ts напрямую или создать файл .ts и позволить компилятору вывести .d.ts для вас.

Осторожно: если вы создаете файл .d.ts, вы должны научить .gitignore заботиться о нем. Вы, вероятно, исключили вывод компилятора (включая .d.ts ) из git. Добавьте строку в конец .gitignore с "!" для «не игнорировать это», за которым следует ваше имя файла:

Создайте файл где-нибудь среди исходников TypeScript. Назовите его types.d.ts (или как-то так, см. выше) и вставьте в него:

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

Это делает явное объявление этого модуля как типа any . Это называется «окружающей декларацией», потому что она плавает в глобальном пространстве среди исходных файлов, которые читает компилятор.

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

Если модуль экспортирует только одну вещь (например, функцию или класс), добавьте строку внизу, чтобы указать одну экспортируемую вещь:

Примечание: мне потребовалось некоторое время, чтобы понять это. Я пытался использовать параметры компилятора, такие как --types и --typeRoots, но они ничего не делали. Это проще. Только не забудьте заключить имя модуля в кавычки; иначе объявление не будет найдено.

Пока вы делаете шрифты для пакета, почему бы не сделать их полными? Затем вы можете отправить PR в DefinitelyTyped, и каждый сможет им воспользоваться!

Идеальное решение — прямо в сообщении об ошибке TS7016: npm install @types/ваш-интересующий-пакет .

Это происходит из специального имени пользователя NPM, @types , где люди публикуют объявления TypeScript отдельно от пакетов, которые они объявляют.

Внимание: вводя объявления типов, вы можете сделать это двумя способами. Установка npm по умолчанию поместит их в зависимости вашего проекта. Не идеально; эти типы используются во время компиляции, а не во время выполнения. Обычно зависимости времени сборки добавляются с помощью npm install --save-dev , и они записываются в devDependencies . Они не поставляются с вашим производственным кодом и не добавляются к транзитивным зависимостям.

Внимание: если ваш проект представляет собой библиотеку, то людям, использующим вашу библиотеку, потребуются эти типы. Если вы поместите их в devDependencies , ваши последующие пользователи не получат их, поэтому они получат ошибки компиляции. Когда вы создаете библиотеку, поместите эти типы в зависимости (по умолчанию). Не используйте --save-dev для установки пакетов из @types при публикации библиотеки TypeScript.

Выводы

Восемь! Это множество способов решить одну проблему.

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

И помните: всегда читайте сообщение об ошибке.

Джессика Керр
< /p>

Джессика Керр

Симматолог, разработчик, спикер, мать, сумасшедший. Атомист. Обучение и рост. она/ее

Начните использовать Atomist уже сегодня. Получите ранний доступ.

Контейнеризация проекта Clojure

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

Контейнеризация проекта Clojure

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

Подготовка к следующему log4shell

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

Подготовка к следующему log4shell

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

Почему вы, вероятно, игнорируете уязвимости контейнера

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

Почему вы, вероятно, игнорируете уязвимости контейнера

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

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

Поскольку недавно в моем списке TODO появился новый побочный проект, я решил, что самое время по-настоящему погрузиться в него. Стек — это ваш типичный *ERN-сделок, вероятно, с использованием Redis вместо MongoDB в качестве основного хранилища данных, и это к чертям собачьим.

И началось обычное беспокойство по поводу запуска совершенно нового проекта с нуля. Холст был пуст, и мне нужно было продолжить исследование.

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

Большая проблема, которая действительно остановила меня на прошлой неделе, заключалась в паре зависимостей, в которых отсутствовали @types, и мне пришлось определять их в собственных объявлениях.

Ошибка изначально возникала как ошибка lint в nvim (через ALE ). В нем говорилось, что мне нужно попробовать установить @type для пакетов, и если это не сработает, хлопнуть по объявлению модуля 'package'; в проекте.

Никаких указаний на то, где это должно быть размещено, поэтому я поместил его в index.d.ts в корне проблемы. Мой линтер заработал, и все было в порядке.

Так было до тех пор, пока я не начал работать с ts-node . На самом деле все отлично работало с ts-node-dev , который я планировал использовать, но мне очень хотелось понять, почему его нет у ts-node.

После тонны исследований и множества попыток (разные имена файлов, настройки в tsconfig.json и т. д.) я все еще был мертв в воде. К счастью, официальная документация по Typescript довольно солидна, и я читал о том, как вы должны объявлять модули.

Строки кода для объявления модуля было достаточно, но простое запихивание дерьма в index.d.ts (или почти в любой другой *.d.ts, если уж на то пошло) не помогло бы.

Чтобы вернуть ts-node в Team Josh, я создал каталог типов и каталог, названный в честь каждой зависимости, которую я пытался объявить.

В каждом каталоге я добавил index.d.ts и добавил вышеупомянутую строку объявления. Выглядело это примерно так:

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

Следующим шагом в этом процессе была настройка typeRoots в моем файле tsconfig.json. Я читал некоторые неоднозначные утверждения об этом, поэтому не совсем уверен, что это лучший подход, но, похоже, это лучший способ убедиться, что мне не нужно настраивать конфигурацию каждый раз, когда мне нужно добавить что-то новое в мои локальные типы. каталог.

Дело в том, что директива typeRoots решает все или ничего. Вы не можете определить свое пользовательское местоположение, и оно загружается в дополнение к значениям по умолчанию.

В связи с этим вы должны обязательно включить каталог @type, который находится в ваших модулях node_modules, а также любые дополнительные местоположения:

После обновления typeRoots ts-node перестал лаять на меня с сообщением Не удалось найти файл объявления для модуля .

Поскольку я пробовал множество вещей ранее, включая определение typeRoots в каталоге с index.d.ts и package.d.ts , я могу сказать вам, что хитрость здесь действительно заключается в структуре каталогов файлов объявлений. .

На данный момент все было в порядке. Проект / шаблон хорошо складывается, и я очень рад запустить здесь новый проект в самом ближайшем будущем.

Если вам хочется обвинить меня в том, что я полный нуб, и/или хотите выделить время, чтобы *рассказать мне, как лучше это сделать, оставьте комментарий ниже!

Хороший материал? Хотите больше?

100 % свежие материалы, контент категории А, отсутствие спама.

О Джоше

Муж. Отец. Папа мопс. Рожденный заново пользователь Linux. Основатель Holiday API, менеджер по бэкэнд-инжинирингу и специалист по эмодзи в Mailshake, а также автор чертовски лучшей библиотеки Lorem Ipsum для PHP.

В этом разделе описываются некоторые расширенные функции JavaScript, поддерживаемые Visual Studio Code. Используя языковую службу TypeScript, VS Code может предоставлять интеллектуальное завершение (IntelliSense), а также проверку типов для JavaScript.

IntelliSense

IntelliSense для JavaScript в Visual Studio Code обеспечивает интеллектуальное завершение кода, информацию о параметрах, поиск по ссылкам и многие другие расширенные языковые функции. Наш JavaScript IntelliSense основан на языковой службе JavaScript, разработанной командой TypeScript. Хотя IntelliSense должен работать для большинства проектов JavaScript без какой-либо настройки, вы можете сделать IntelliSense еще более полезным с помощью JSDoc или настроив проект jsconfig.json.

Подробнее о том, как работает JavaScript IntelliSense, в том числе о том, как он основан на выводе типов, аннотациях JSDoc, объявлениях TypeScript и комбинировании проектов JavaScript и TypeScript, см. в документации по языковой службе JavaScript.

Если вывод типа не дает желаемой информации, информация о типе может быть предоставлена ​​явно с помощью аннотаций JSDoc. В этом документе описаны поддерживаемые в настоящее время аннотации JSDoc.

В дополнение к объектам, методам и свойствам окно JavaScript IntelliSense также обеспечивает базовое завершение слов для символов в вашем файле.

Ввод и автоматическое получение типов

Библиотеки и платформы IntelliSense для JavaScript основаны на файлах объявления типов (типизации) TypeScript. Файлы объявлений типов написаны на TypeScript, поэтому они могут выражать типы данных параметров и функций, что позволяет VS Code эффективно обеспечивать богатый опыт работы с IntelliSense.

Многие популярные библиотеки поставляются с файлами типизации, поэтому IntelliSense для них устанавливается автоматически. Для библиотек, которые не включают типизацию, функция автоматического получения типов VS Code автоматически установит для вас файл типизации, поддерживаемый сообществом.

Для автоматического получения типа требуется npmjs, диспетчер пакетов Node.js, который входит в состав среды выполнения Node.js. На этом изображении вы можете увидеть IntelliSense, включая сигнатуру метода, информацию о параметрах и документацию по методу для популярной библиотеки lodash.

lodash typings

Файлы объявлений типов автоматически загружаются и управляются Visual Studio Code для пакетов, перечисленных в package.json вашего проекта или импортированных в файл JavaScript.

В качестве альтернативы вы можете явно перечислить пакеты, для которых нужно получить файлы объявления типов, в jsconfig.json.

Большинство распространенных библиотек JavaScript поставляются с файлами объявлений или имеют доступные файлы объявлений типов. Вы можете найти пакет файла объявления типа библиотеки, используя сайт TypeSearch.

Исправлено предупреждение npm не установлено для автоматического получения типа

Automatic Type Acquisition использует npm, диспетчер пакетов Node.js, для установки и управления файлами объявления типов (типизации). Чтобы убедиться, что автоматическое получение типов работает правильно, сначала убедитесь, что на вашем компьютере установлен npm.

Запустите npm --version из терминала или командной строки, чтобы быстро проверить, установлен ли и доступен ли npm.

Если у вас установлен npm, но по-прежнему отображается предупреждающее сообщение, вы можете явно указать VS Code, где установлен npm, с помощью параметра typescript.npm. Это должен быть полный путь к исполняемому файлу npm на вашем компьютере, и он не должен совпадать с версией npm, которую вы используете для управления пакетами в вашей рабочей области. typescript.npm требует TypeScript 2.3.4+.

Например, в Windows вы должны добавить такой путь в файл settings.json:

Проекты JavaScript (jsconfig.json)

Наличие файла jsconfig.json в каталоге указывает, что каталог является корнем проекта JavaScript. jsconfig.json указывает корневые файлы и параметры языковых функций, предоставляемых языковой службой JavaScript. Для обычных настроек файл jsconfig.json не требуется, однако бывают ситуации, когда вы захотите добавить файл jsconfig.json .

  • Не все файлы должны быть в вашем проекте JavaScript (например, вы хотите исключить некоторые файлы из показа IntelliSense). Такая ситуация характерна для внешнего и внутреннего кода.
  • Ваша рабочая область содержит более одного контекста проекта. В этом случае вам следует добавить файл jsconfig.json в корневую папку каждого проекта.
  • Вы используете компилятор TypeScript для компиляции исходного кода JavaScript нижнего уровня.

Расположение jsconfig.json

Чтобы определить наш код как проект JavaScript, создайте jsconfig.json в корне вашего кода JavaScript, как показано ниже. Проект JavaScript представляет собой исходные файлы проекта и не должен включать производные или упакованные файлы (например, каталог dist).

jsconfig setup< бр />

В более сложных проектах в рабочей области может быть определено несколько файлов jsconfig.json. Это необходимо сделать, чтобы исходный код одного проекта не отображался в IntelliSense другого проекта.

Ниже показан проект с папкой клиента и сервера, показывающий два отдельных проекта JavaScript:

несколько jsconfigs< бр />

Написание файла jsconfig.json

Ниже приведен простой шаблон для файла jsconfig.json, который определяет цель JavaScript как ES6, а атрибут exclude исключает папку node_modules. Вы можете скопировать и вставить этот код в свой файл jsconfig.json.

Атрибут exclude сообщает языковой службе, какие файлы не являются частью вашего исходного кода. Если IntelliSense работает медленно, добавьте папки в список исключений (VS Code предложит вам сделать это, если обнаружит медленные завершения). Вы захотите исключить файлы, созданные в процессе сборки (например, каталог dist). Эти файлы будут вызывать двойное отображение предложений и замедлят работу IntelliSense.

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

Вот пример с явным включенным атрибутом:

Наилучшая практика и наименее подверженный ошибкам путь — использовать атрибут include с одной папкой src. Обратите внимание, что пути к файлам в exclude и include относятся к расположению jsconfig.json .

Для получения дополнительной информации см. полную документацию по jsconfig.json.

Переход на TypeScript

Возможны смешанные проекты TypeScript и JavaScript. Чтобы начать миграцию на TypeScript, переименуйте файл jsconfig.json в tsconfig.json и установите для свойства allowJs значение true . Дополнительную информацию см. в разделе Миграция с JavaScript.

Примечание. jsconfig.json — это то же самое, что и файл tsconfig.json, только если для параметра allowJ установлено значение true. См. документацию для tsconfig.json здесь, чтобы увидеть другие доступные параметры.

Проверка типов JavaScript

VS Code позволяет использовать некоторые расширенные функции TypeScript для проверки типов и создания отчетов об ошибках в обычных файлах JavaScript. Это отличный способ выявить распространенные ошибки программирования. Эти проверки типов также позволяют использовать несколько замечательных быстрых исправлений для JavaScript, в том числе «Добавить отсутствующий импорт» и «Добавить отсутствующее свойство».

TypeScript может выводить типы в файлах .js так же, как и в файлах .ts. Когда типы невозможно вывести, их можно указать с помощью комментариев JSDoc. Вы можете узнать больше о том, как TypeScript использует JSDoc для проверки типов JavaScript, в разделе Проверка типов файлов JavaScript.

Проверка типов JavaScript является необязательной и необязательной. Существующие инструменты проверки JavaScript, такие как ESLint, можно использовать вместе с новой встроенной функцией проверки типов.

Вы можете начать проверку типов несколькими способами, в зависимости от ваших потребностей.

По файлу

Самый простой способ включить проверку типов в файле JavaScript — добавить // @ts-check в начало файла.

Использование // @ts-check — хороший подход, если вы просто хотите попробовать проверку типов в нескольких файлах, но еще не включили ее для всей кодовой базы.

Использование настройки

Чтобы включить проверку типов для всех файлов JavaScript без изменения кода, просто добавьте "js/ts.implicitProjectConfig.checkJs": true в рабочую область или настройки пользователя.Это включает проверку типов для любого файла JavaScript, который не является частью проекта jsconfig.json или tsconfig.json.

Вы можете отключить проверку типов для отдельных файлов с помощью комментария // @ts-nocheck в верхней части файла:

Вы также можете отключить отдельные ошибки в файле JavaScript с помощью комментария // @ts-ignore в строке перед ошибкой:

Использование jsconfig или tsconfig

Чтобы включить проверку типов для файлов JavaScript, которые являются частью jsconfig.json или tsconfig.json , добавьте "checkJs": true в параметры компилятора проекта:

Это включает проверку типов для всех файлов JavaScript в проекте. Вы можете использовать // @ts-nocheck, чтобы отключить проверку типов для каждого файла.

Для проверки типов JavaScript требуется TypeScript 2.3. Если вы не уверены, какая версия TypeScript в данный момент активна в вашей рабочей области, запустите команду TypeScript: выберите версию TypeScript для проверки. Для выполнения этой команды у вас должен быть открыт файл .js/.ts в редакторе. Если вы откроете файл TypeScript, версия появится в правом нижнем углу.

Глобальные переменные и проверка типов

Допустим, вы работаете с устаревшим кодом JavaScript, в котором используются глобальные переменные или нестандартные API DOM:

Если вы попытаетесь использовать // @ts-check с приведенным выше кодом, вы увидите ряд ошибок, связанных с использованием глобальных переменных:

  1. Строка 2. Свойство "webkitNotifications" не существует для типа "Window".
  2. Строка 2. Не удается найти имя «CAN_NOTIFY».
  3. Строка 3. Свойство "webkitNotifications" не существует для типа "Window".

Если вы хотите и дальше использовать // @ts-check, но уверены, что это не реальные проблемы с вашим приложением, вы должны сообщить TypeScript об этих глобальных переменных.

Для начала создайте файл jsconfig.json в корне вашего проекта:

Затем перезагрузите VS Code, чтобы убедиться, что изменения применены. Наличие jsconfig.json позволяет TypeScript узнать, что ваши файлы Javascript являются частью более крупного проекта.

Теперь создайте файл globals.d.ts где-нибудь в рабочей области:

Файлы d.ts являются объявлениями типов. В этом случае globals.d.ts позволяет TypeScript узнать, что существует глобальный CAN_NOTIFY и что свойство webkitNotifications существует в окне. Подробнее о написании d.ts можно прочитать в документации по TypeScript. d.ts не меняют способ оценки JavaScript, они используются только для улучшения поддержки языка JavaScript.

Использование задач

Использование компилятора TypeScript

Одной из ключевых особенностей TypeScript является возможность использовать новейшие функции языка JavaScript и создавать код, который может выполняться в средах выполнения JavaScript, которые еще не понимают эти новые функции. Теперь, когда JavaScript использует тот же языковой сервис, он также может использовать эту функцию.

Компилятор TypeScript tsc может понизить уровень компиляции файлов JavaScript из ES6 до уровня другого языка. Настройте jsconfig.json с нужными параметрами, а затем используйте аргумент –p, чтобы заставить tsc использовать ваш файл jsconfig.json, например, tsc -p jsconfig.json для компиляции более низкого уровня.

Подробнее о параметрах компилятора для компиляции нижнего уровня читайте в документации по jsconfig.

Запуск Вавилона

Транспилятор Babel преобразует файлы ES6 в удобочитаемый JavaScript ES5 с помощью исходных карт. Вы можете легко интегрировать Babel в свой рабочий процесс, добавив приведенную ниже конфигурацию в файл tasks.json (расположенный в папке .vscode рабочей области). Параметр группы делает эту задачу жестом по умолчанию Задача: Запустить задачу сборки. isBackground указывает VS Code продолжать выполнение этой задачи в фоновом режиме. Чтобы узнать больше, перейдите в раздел "Задачи".

После того, как вы добавили это, вы можете запустить Babel с помощью команды ⇧⌘B (Windows, Linux Ctrl+Shift+B ) (Запустить задачу сборки), и она скомпилирует все файлы из каталога src в каталог lib.< /p>

Совет. Для получения справки по Babel CLI см. инструкции в разделе Использование Babel. В приведенном выше примере используется параметр CLI.

Отключить поддержку JavaScript

Если вы предпочитаете использовать функции языка JavaScript, поддерживаемые другими инструментами языка JavaScript, такими как Flow, вы можете отключить встроенную поддержку JavaScript в VS Code. Для этого отключите встроенное расширение языка TypeScript TypeScript и функции языка JavaScript (vscode.typescript-language-features), которое также обеспечивает поддержку языка JavaScript.

Чтобы отключить поддержку JavaScript/TypeScript, перейдите в представление «Расширения» ( ⇧⌘X (Windows, Linux Ctrl+Shift+X )) и отфильтруйте встроенные расширения («Показать встроенные расширения» в раскрывающемся списке «Дополнительные действия»). , затем введите «машинопись». Выберите расширение «Возможности языка TypeScript и JavaScript» и нажмите кнопку «Отключить». Встроенные расширения VS Code нельзя удалить, их можно только отключить, и их можно снова включить в любое время.

Расширение функций языка TypeScript и JavaScript

Частичный режим IntelliSense

VS Code пытается предоставить IntelliSense для всего проекта для JavaScript и TypeScript, что делает возможными такие функции, как автоматический импорт и переход к определению. Однако в некоторых случаях VS Code может работать только с открытыми файлами и не может загружать другие файлы, составляющие ваш проект JavaScript или TypeScript.

Это может произойти в нескольких случаях:

  • Вы работаете с кодом JavaScript или TypeScript на vscode.dev или github.dev, а VS Code запущен в браузере.
  • Вы открываете файл из виртуальной файловой системы (например, при использовании расширения GitHub Repositories).
  • Проект загружается. После завершения загрузки вы начнете получать IntelliSense для всего проекта.

В этих случаях IntelliSense VS Code будет работать в частичном режиме. Частичный режим делает все возможное, чтобы предоставить IntelliSense для любых открытых файлов JavaScript или TypeScript, но он ограничен и не может предлагать какие-либо функции IntelliSense для нескольких файлов.

Какие функции затронуты?

Вот неполный список функций, которые либо отключены, либо имеют более ограниченную функциональность в частичном режиме:

  • Все открытые файлы рассматриваются как часть одного проекта.
  • Параметры конфигурации из вашего jsconfig или tsconfig (например, target ) не учитываются.
  • Сообщается только о синтаксических ошибках. О семантических ошибках, таких как доступ к неизвестному свойству или передача функции неправильного типа, не сообщается.
  • Быстрые исправления семантических ошибок отключены.
  • Символы могут быть разрешены только в текущем файле. Любые символы, импортированные из других файлов, будут считаться символами любого типа.
  • Такие команды, как «Перейти к определению» и «Найти все ссылки», будут работать только для открытых файлов, а не для всего проекта. Это также означает, что символы из любых пакетов, которые вы устанавливаете в node_module, не будут разрешены.
  • Поиск символов в рабочей области будет включать символы только из открытых в данный момент файлов.
  • Автоматический импорт отключен.
  • Переименование отключено.
  • Многие рефакторинги отключены.

Некоторые дополнительные функции отключены на vscode.dev и github.dev:

Проверка, не находитесь ли вы в частичном режиме

Чтобы проверить, использует ли текущий файл IntelliSense частичного режима вместо IntelliSense для всего проекта, наведите указатель мыши на элемент состояния языка JavaScript или TypeScript в строке состояния:

 Элемент статуса частичного режима

Элемент состояния будет показывать Частичный режим, если текущий файл находится в частичном режиме.

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