vscode імпортувати консоль імпорту = вимагати ("консоль"); автоматично


145
import console = require("console");

console.<< Я набираю. і вище, автоматично імпортується у VScode. Хтось знає, як це відключити?

(Я припускаю, що це одне з моїх розширень. Напевно, красивіше.)

редагувати: це відбувається лише в середовищі React Typescript. не в Typescript без реакції.


якась удача з цим? У мене те саме питання
користувач2517182

Крім обхідних варіантів відповідей, здається, що це помилка в VSCode, введена з останнім оновленням. Відповідний звіт про помилки заповнюється тут: github.com/Microsoft/vscode/isissue/70157
ofhouse

1
TS / JS Nightly плагін виправляє це для VSCode 1.36+
Ендрю Лі

Відповіді:


126

Відмова від відповідальності: це не слід вважати "рішенням", але це найпростіший / швидкий.

Ця відповідь передбачає, що ви використовуєте VSCode. Інші ІДЕ повинні бути подібними.

  1. Почніть вводити текст console
  2. Клацніть Enter або введіть ., щоб 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
Це редагування файлу всередині nir_modules dir, що означає, що "fix" буде скинуто, коли ви знову встановите npm. Я розумію, що це швидко виправити, але не там, де це є прийнятним
Railto

Для всіх, хто не хоче змінювати файл декларації, TS / JS Nightly Plugin виправляє це для VSCode 1.36+
Andrew Li

31

Це я пережив і це, мабуть, проблема з функцією автоматичного імпорту у VSCode. Якщо вимкнути всі розширення, це, мабуть, також не зникне.

Як вирішення, ви можете відключити автоімпорт у налаштуваннях.

Якщо ви використовуєте Javascript

"javascript.suggest.autoImports": помилково

Якщо ви використовуєте Typescript

"typecript.suggest.autoImports": false

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

EDIT: Несправний автоімпорт виникає через цей код у пакеті вниз по дереву залежностей

declare module "console" {
    export = console;
}

Пакет може бути розташований у вашому локальному каталозі node_modules або у посилальному пакеті, встановленому в усьому світі.

  1. Шукайте локальні модулі node_ declare module "console"
  2. Якщо ви знайдете його в локальному пакеті, запустіть, npm list [packageName]щоб визначити, який пакет у package.json залежить від пакета з кодом консолі.

Якщо ви не знайдете код у своїх локальних модулях node_, ви можете також

  1. Виключіть пакети один за іншим у package.json

  2. Шукайте код консолі в глобально встановлених модулях, на які можуть бути посилання пакетами у вашому проекті

% USERPROFILE% \ AppData \ Роумінг \ npm \ node_modules% USERPROFILE% \ AppData \ Local \ Microsoft \ TypeScript

Я знаю, що це не просте рішення, але я сподіваюся, що це допомагає, у моєму випадку у мене було посилання на react-native-copilot -> rimraf -> вузол, у якому був консольний код. Видалення реакції-нативної копіювальної машини вирішило проблему.


8
Так, це також не спричиняє більше жодної роботи з імпорту авто. Мені подобається ця функція, і я не сприймаю це як відповідь ...: - D (хоча спасибі!) Має бути інше рішення. Я все ще дивлюсь також.
dragonsoul

Я з’ясував, що цього не відбувається, коли ви створюєте новий проект за допомогою create-react-app my-app --scripts-version = react-scriptpts-t, тому його треба якось підключити до налаштувань робочої області.
dragonsoul

Я провів ще кілька досліджень, побачимо відредаговану відповідь, сподіваюся, ви знайдете її у своєму проекті!
KvD

1
Так, це справді спрацювало. Я думаю, це помилка VSCode чи від творців цих пакетів? Для мене це було у @ types / node та @ types / react-dom. Дякую :-)
dragonsoul

4
виявив несправний код всередині "typecript/3.2/node_modules/@types/node/index.d.ts", який знаходиться всередині ~/Library/Caches/папки. Я на mac. Оскільки він знаходиться в робочій області кешування, я просто видалив фактичний код: `` `lang-js оголошує модуль" console "{export = console; } `` І це спрацювало!
jcperez-ch

17

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

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

Це запобіжить автоматичний імпорт.

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


Це елегантне рішення, яке можна зареєструвати і працюватиме на різних робочих просторах та пристроях. Дякую!
phsource

4
Чому я отримую "Вираз присвоєння експорту повинен бути ідентифікатором або кваліфікованим ім'ям в оточуючому контексті.ts (2714)"? Можливо, це стосується якихось параметрів у моєму tsconfig.json?
Мехмет Н. Ярар

Так, це могло ... Ви можете перевірити мої налаштування тут: github.com/codechecks/monorepo/blob/master/tsconfig.json Працює з файлом console.d.ts
Krzysztof

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. Clever тимчасове рішення, але я не можу прийняти це як рішення ...
dragonsoul

не працювало. він все ще автоматично імпортує після того, як я напишу консоль, потім натискаю "". це імпорт авто
Mr.Ghamkhar

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

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, а не типи вузлів.

Залежно від вашого проекту, можливо, вам доведеться явно додати набір пакетів базового типу в параметр type ( 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.