vscode import import console = require («console»); автоматически


145
import console = require("console");

console.<< Я печатаю. и выше импортируется автоматически в VScode. Кто-нибудь знает, как это отключить?

(Я предполагаю, что это одно из моих расширений. Возможно, красивее.)

редактировать: это происходит только в среде React Typescript. не в Typescript без реакции.


удачи с этим? У меня та же проблема
user2517182

Помимо обходных путей в ответах кажется, что это ошибка в VSCode, появившаяся с последним обновлением. Соответствующий отчет об ошибке заполняется здесь: github.com/Microsoft/vscode/issues/70157
ofhouse

1
TS / JS Nightly плагин исправляет это для VSCode 1.36+
Эндрю Ли

Ответы:


126

Отказ от ответственности: это не должно рассматриваться как «решение», но это самое простое / быстрое.

Этот ответ предполагает, что вы используете VSCode. Другие IDE должны быть похожими.

  1. Начните печатать console
  2. Нажмите ввод или введите ., позволяя IntelliSense добавитьimport console = require("console");
  3. Ctrl + клик (или F12, или Cmd + клик на macOS) на require("console")
  4. Закомментируйте этот код:
declare module "console" {
    export = console;
}

9
Если бы это был Reddit, я бы дал тебе золото за это. Спасибо :)
FearMediocrity

5
Работает красиво. Это должен быть Cmd + клик "console", но это деталь. Спасибо!
Loolooii

Если возникают проблемы с нажатием F12 или Cmd +, щелкните правой кнопкой мыши на «консоли», а затем «перейти к определению» также работает (по крайней мере, на OSX)
imekinox

2
Это редактирование файла внутри директории node_modules, что означает, что 'fix' будет сброшен после повторной установки npm. Я
понял,

Всем тем, кто не хочет изменять файл декларации, плагин TS / JS Nightly исправляет это для VSCode 1.36+
Эндрю Ли

31

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

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

Если вы используете Javascript

"javascript.suggest.autoImports": false

Если вы используете Typescript

"typescript.suggest.autoImports": false

введите описание изображения здесь

РЕДАКТИРОВАТЬ: сбой автоимпорта происходит из-за этого кода в пакете вниз по дереву зависимостей

declare module "console" {
    export = console;
}

Пакет может находиться либо в вашем локальном каталоге node_modules, либо в глобальном пакете, на который есть ссылка.

  1. Найдите свои локальные node_modules для declare module "console"
  2. Если вы найдете его в локальном пакете, запустите, npm list [packageName]чтобы определить, какой пакет в package.json зависит от пакета с консольным кодом в нем.

Если вы не можете найти код в своих локальных node_modules, вы можете либо

  1. Исключите пакеты один за другим в package.json

  2. Ищите код консоли в глобально установленных модулях, на которые могут ссылаться пакеты в вашем проекте

% USERPROFILE% \ AppData \ Roaming \ npm \ node_modules% USERPROFILE% \ AppData \ Local \ Microsoft \ TypeScript

Я знаю, что это не прямолинейное решение, но я надеюсь, что оно поможет, в моем случае у меня была ссылка с узлаact-native-copilot -> rimraf ->, в которой был консольный код. Удаление реакции-родного-второго пилота решило проблему.


8
да, это также не вызывает больше никакой работы автоматического импорта. Мне нравится эта функция, и я не принимаю это как ответ ...: D (спасибо, хотя!) Должно быть другое решение. Я все еще ищу.
Dragononsoul

Я обнаружил, что этого не происходит, когда вы создаете новый проект с помощью create-Reaction-app my-app --scripts-version = реагировать-scripts-ts, поэтому его необходимо каким-то образом подключить к настройкам рабочей области.
Dragononsoul

Я провел еще несколько исследований, см. Отредактированный ответ, надеюсь, вы найдете его в своем проекте!
KvD

1
Да, это действительно работает. Я думаю, это ошибка VSCode или от создателей этих пакетов? Для меня это было в @ types / node и @ types / реагировать-dom. Спасибо :-)
Dragononsoul

4
нашел неисправный код внутри "typescript/3.2/node_modules/@types/node/index.d.ts", которая находится внутри ~/Library/Caches/папки. Я на маке. Поскольку он находится в моей рабочей области кэширования, я просто удалил сам код: `` `lang-js объявление модуля" console "{export = console; } `` `И это сработало!
jcperez-ch

17

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

declare module 'console' {
    export = typeof import("console");
}

Это предотвратит автоматический импорт.

Кредиты: https://github.com/Microsoft/TypeScript/issues/30471#issuecomment-474963436


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

4
Почему я получаю «Выражение присваивания экспорта должно быть идентификатором или квалифицированным именем в окружающем context.ts (2714)»? Может быть связано с некоторыми настройками в моем tsconfig.json?
Мехмет Н.

Да, это может ... Вы можете проверить мои настройки здесь: github.com/codechecks/monorepo/blob/master/tsconfig.json Это работает с файлом console.d.ts
Кшиштоф Качор

17

Если вы добавите фрагмент для вставки console.logи будете использовать его вместо этого, то не будет автоматического импорта «консоли».

https://code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-own-snippets

вот мой фрагмент:

{
    "Print to console": {
        "prefix": "cl",
        "body": [
            "console.log('$1');",
        ],
        "description": "Log output to console"
    }
}

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

Я согласен с @tibuurcio. Умный обходной путь, но я не могу принять это как решение ...
Dragononsoul

не работал это все еще автоматически импортирует после того, как я пишу консоль, тогда я нажимаю "." это авто импорт
Mr.Ghamkhar

1
@ mr-ghamkhar, если вы хотите использовать приведенный выше фрагмент, вам просто нужно написать «cl» или что-то, что вы добавили в «prefix». Это должно быть что-то еще, кроме «консоли», чтобы можно было избежать поведения автоимпорта.
Джорджио

9

Если вы мне нравитесь, забывает "cl", вы можете использовать несколько префиксов в фрагментах :)

{
    "Print to console": {
        "prefix": ["cl","co","con","cons","conso","consol","console", "console.l","console.lo","console.log"],
        "body": [
            "console.log($1);",
        ],
        "description": "Log output to console"
    }   
}

1
Истинный ответ ленивый :)
FOLOF

Это лучшее решение для меня, потому что вам не нужно редактировать внутренние пакеты
Harrison

5

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

У меня была такая же проблема, и я исправил ее, добавив:

types: []

в мой файл tsconfig.json. Это отключает TypeScript (и расширение VSCode) от автоматического импорта всех пакетов узлов, которые имеют@types/ в конфигурации проекта. Это не мешает TS импортировать определения этих типов, если вы явно импортируете пакет, используя эти типы.

В моем конкретном случае consoleопределение исходило из@types/node , которое было импортировано в проект как зависимость от Storybook. Тем не менее, мой проект был проектом webpack, предназначенным для запуска в браузере, поэтому импорт типов Node.js в мой исходный код не имел смысла. Базовый набор типов, которые вы хотели бы использовать в браузере, - это типы dom, а не типы узлов.

В зависимости от вашего проекта вам может понадобиться явно добавить набор пакетов базового типа в параметр types ( types: ["dom", "react"]и т. Д.). Тем не менее, в моем случае это оказалось ненужным, мой проект смог прекрасно скомпилироваться с пустым списком. И тенденция VSCode автоматически импортировать «консоль», похоже, полностью исчезла; Я не заметил никаких других побочных эффектов.

Более подробную информацию о настройке типов в tsconfig.json можно найти здесь: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.