vscode import import import = ต้องการ (“ console”); อัตโนมัติ


145
import console = require("console");

console.<< ฉันพิมพ์ และข้างต้นจะถูกนำเข้าโดยอัตโนมัติใน VScode ใครรู้วิธีปิดการใช้งานนั้น

(ฉันถือว่ามันเป็นหนึ่งในส่วนขยายของฉันน่าจะสวยกว่านี้)

แก้ไข: มันเกิดขึ้นเฉพาะในสภาพแวดล้อมของ React typescript ไม่ได้อยู่ใน typescript โดยไม่มีการตอบสนอง


มีโชคกับเรื่องนี้ไหม? ฉันมีปัญหาเดียวกัน
user2517182

นอกเหนือจากการแก้ไขปัญหาในคำตอบดูเหมือนว่านี่เป็นข้อบกพร่องใน VSCode ที่นำมาใช้กับการอัปเดตครั้งล่าสุด รายงานข้อผิดพลาดที่เกี่ยวข้องจะถูกกรอกที่นี่: github.com/Microsoft/vscode/issues/70157
ofhouse

คำตอบ:


126

ข้อจำกัดความรับผิดชอบ: สิ่งนี้ไม่ควรถูกพิจารณาว่าเป็น "ทางออก" แต่เป็นวิธีที่ง่ายที่สุด

คำตอบนี้สมมติว่าคุณกำลังใช้ VSCode IDE อื่น ๆ ควรคล้ายกัน

  1. เริ่มพิมพ์ console
  2. คลิกป้อนหรือพิมพ์.อนุญาตให้เพิ่มIntelliSenseimport 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 dir หมายความว่า 'แก้ไข' จะถูกรีเซ็ตเมื่อคุณทำการติดตั้ง npm อีกครั้ง ฉันได้รับการแก้ไขอย่างรวดเร็ว แต่ไม่มีที่ไหนใกล้พอที่จะยอมรับ
Railto

สำหรับทุกคนที่ไม่ต้องการแก้ไขไฟล์ประกาศปลั๊กอินคืน TS / JS จะแก้ไขสิ่งนี้สำหรับ VSCode 1.36+
Andrew Li

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

ฉันรู้ว่านี่ไม่ใช่วิธีแก้ปัญหาที่ตรงไปตรงมา แต่ฉันหวังว่ามันจะช่วยได้ในกรณีของฉันฉันมีการอ้างอิงจาก react-native-copilot -> rimraf -> โหนดซึ่งมีรหัสคอนโซลอยู่ การลบ react-native-copilot ออกเพื่อแก้ไขปัญหา


8
ใช่ที่ทำให้ไม่มีการนำเข้ารถยนต์อื่น ๆ อีกต่อไป ฉันชอบคุณสมบัตินี้และไม่ยอมรับสิ่งนี้เป็นคำตอบ ... : - D (ขอบคุณด้วย!) ต้องมีวิธีแก้ไขปัญหาอื่น ฉันยังคงมองเช่นกัน
dragonsoul

ฉันพบว่ามันไม่ได้เกิดขึ้นเมื่อคุณสร้างโครงการใหม่ด้วย create-react-app my-app --scripts-version = react-script-ts ดังนั้นจึงต้องเชื่อมต่อกับการตั้งค่าพื้นที่ทำงานอย่างใด
dragonsoul

ฉันทำการวิจัยเพิ่มเติมดูคำตอบที่แก้ไขหวังว่าคุณจะพบมันในโครงการของคุณ!
KvD

1
ใช่มันใช้งานได้จริง ฉันคิดว่านี่เป็นข้อผิดพลาด VSCode หรือจากผู้สร้างแพ็คเกจเหล่านี้หรือไม่ สำหรับฉันมันอยู่ใน @ types / node และ @ types / react-dom ขอบคุณ :-)
dragonsoul

4
พบรหัสที่ผิดพลาดภายใน "typescript/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/issues/30471#issuecomment-474963436


นี่เป็นโซลูชั่นสุดหรูที่สามารถเช็คอินและจะทำงานในพื้นที่ทำงานและอุปกรณ์หลายรายการ ขอบคุณ!
phsource

4
เหตุใดฉันจึงได้รับ“ การแสดงออกของการมอบหมายการส่งออกจะต้องเป็นตัวระบุหรือชื่อที่ผ่านการรับรองในบริบทแวดล้อม (2714)” อาจเกี่ยวข้องกับการตั้งค่าบางอย่างใน tsconfig.json ของฉันหรือไม่
เมห์เม็ต N. Yarar

ใช่มันเป็นไปได้ ... คุณสามารถตรวจสอบการตั้งค่าของฉันได้ที่นี่: github.com/codechecks/monorepo/blob/master/tsconfig.jsonมันทำงานกับไฟล์ console.d.ts
Krzysztof Kaczor

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 วิธีแก้ปัญหาที่ชาญฉลาด แต่ฉันไม่สามารถยอมรับได้ว่านี่เป็นวิธีการแก้ปัญหา ...
dragonsoul

ไม่ทำงาน มันยังคงนำเข้าโดยอัตโนมัติหลังจากที่ฉันเขียนคอนโซลจากนั้นฉันกด "" มันนำเข้าโดยอัตโนมัติ
Mr.Ghamkhar

1
@ mr-ghamkhar หากคุณต้องการใช้ตัวอย่างข้างต้นคุณเพียงแค่ต้องเขียน "cl" หรือสิ่งที่คุณใส่ใน "คำนำหน้า" ต้องเป็นอย่างอื่นที่ไม่ใช่ "คอนโซล" เพื่อให้สามารถหลีกเลี่ยงพฤติกรรมการนำเข้าอัตโนมัติ
Giorgio

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
คำตอบที่แท้จริงคือสันหลังยาว :)
24419

นี่เป็นทางออกที่ดีที่สุดสำหรับฉันเพราะคุณไม่จำเป็นต้องแก้ไขแพ็คเกจภายใน
Harrison

5

วิธีหนึ่งในการป้องกันไม่ให้สิ่งนี้เกิดขึ้นคือการปรับเปลี่ยนไฟล์ tsconfig.json ของคุณเพื่อ จำกัด ชุดประเภทที่จะนำเข้าสู่โครงการของคุณโดยอัตโนมัติ

ฉันมีปัญหาเดียวกันนี้และฉันแก้ไขได้โดยการเพิ่ม:

types: []

ลงในไฟล์ tsconfig.json ของฉัน สิ่งนี้จะปิดการใช้งานของ TypeScript (และโดยส่วนขยาย VSCode) จากการนำเข้าแพคเกจโหนดทั้งหมดที่อยู่@types/ในการกำหนดค่าโครงการโดยอัตโนมัติ สิ่งนี้ไม่ได้ป้องกัน TS จากการนำเข้าคำจำกัดความประเภทเหล่านั้นหากคุณนำเข้าแพคเกจโดยใช้ประเภทเหล่านั้นอย่างชัดเจน

ในกรณีเฉพาะของฉันconsoleคำจำกัดความมาจาก@types/nodeซึ่งได้ถูกนำเข้าสู่โครงการเป็นการอ้างอิงของ Storybook อย่างไรก็ตามโครงการของฉันเป็นโครงการ webpack ตั้งใจให้ทำงานในเบราว์เซอร์ดังนั้นการนำเข้าประเภท Node.js ลงในซอร์สโค้ดของฉันไม่สมเหตุสมผล ชุดฐานชนิดที่คุณต้องการใช้ในเบราว์เซอร์คือประเภท dom ไม่ใช่ประเภทโหนด

ขึ้นอยู่กับโครงการของคุณคุณอาจต้องเพิ่มชุดของประเภทแพคเกจฐานลงในพารามิเตอร์ประเภท ( types: ["dom", "react"]และอื่น ๆ ) อย่างไรก็ตามในกรณีของฉันสิ่งนี้กลับกลายเป็นว่าไม่จำเป็นโครงการของฉันสามารถรวบรวมได้ดีกับรายการที่ว่างเปล่า และแนวโน้มของ VSCode ที่จะนำเข้า 'คอนโซล' โดยอัตโนมัติดูเหมือนจะหายไปหมดแล้ว ฉันไม่ได้สังเกตเห็นผลร้ายอื่น ๆ จนถึงตอนนี้

ข้อมูลเพิ่มเติมเกี่ยวกับประเภทการตั้งค่าใน tsconfig.json ที่นี่: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.