typescript react - ไม่พบไฟล์ประกาศสำหรับโมดูล '' react-materialize ' 'path / to / module-name.js' โดยปริยายมีประเภทใดก็ได้


99

ฉันกำลังพยายามนำเข้าส่วนประกอบจาก react-materialize เป็น -

import {Navbar, NavItem} from 'react-materialize';

แต่เมื่อ webpack กำลังรวบรวมของฉัน.tsxมันแสดงข้อผิดพลาดสำหรับข้างต้นเป็น -

ERROR in ./src/common/navbar.tsx
(3,31): error TS7016: Could not find a declaration file for module 'react-materi
alize'. 'D:\Private\Works\Typescript\QuickReact\node_modules\react-materialize\l
ib\index.js' implicitly has an 'any' type.

ความละเอียดใด ๆ สำหรับสิ่งนี้ฉันไม่แน่ใจว่าจะแก้ไขคำสั่งการนำเข้านี้อย่างไรให้ใช้งานได้ts-loaderและ webpack

index.jsของการตอบสนอง-เป็นตัวเป็นตนลักษณะชอบนี้ แต่วิธีแก้ปัญหานี้สำหรับการนำเข้าโมดูลในไฟล์ของฉันเอง ..

https://github.com/react-materialize/react-materialize/blob/master/src/index.js


2
คุณต้องติดตั้งการพิมพ์ / ประเภทสำหรับแพ็คเกจ (npm install @ types / react-materialize) อย่างไรก็ตามดูเหมือนว่าจะยังไม่มีอยู่ดังนั้นคุณอาจต้องสร้างขึ้นเอง ฉันพบว่าบทความนี้มีประโยชน์ - templecoding.com/blog/2016/03/31/…
T Mitchell

@T Mitchell นั่นหมายความว่าประเภทใดที่เราขาดหายไปเราจะไม่สามารถรวบรวม webpack ได้หากไม่มีการสร้างประเภทเหล่านี้ น่าจะมีวิธีไหนบ้าง?
Joy


ดูเหมือนจะเป็นวิธีแก้ปัญหาเล็กน้อยสำหรับฉัน
SuperUberDuper

คำตอบ:


73

ผมมีข้อผิดพลาดที่คล้ายกัน react-routerแต่สำหรับฉันมันเป็น แก้ไขได้โดยการติดตั้งประเภทสำหรับมัน

npm install --save @types/react-router

ข้อผิดพลาด:

(6,30): error TS7016: Could not find a declaration file for module 'react-router'. '\node_modules\react-router\index.js' implicitly has an 'any' type.

หากคุณต้องการที่จะปิดการใช้งานเว็บไซต์ของมันกว้างคุณสามารถแทนการแก้ไขtsconfig.jsonและการตั้งค่าไปnoImplicitAnyfalse


แม้ว่าในขณะนี้ยังไม่มีแพ็คเกจ @ types / react-navigation-tabs ดังกล่าว"noImplicitAny": false,แต่สิ่งที่กล่าวถึงก็ยังปิดการใช้งาน (ฉันได้รับปัญหานี้เนื่องจากการใช้ MyProject --template typescript เริ่มต้นแบบ react-native ฉันคิดอย่างนั้นอย่างน้อยที่สุด) 👍
บน -

1
หรือyarn add @types/react-router --dev
Omar Tariq

57

สำหรับใครที่อยากรู้ว่าฉันเอาชนะเรื่องนี้ได้อย่างไร ฉันแฮ็คสิ่งของชนิดหนึ่ง

ภายในโปรเจ็กต์ของฉันฉันสร้างโฟลเดอร์ที่เรียกว่า@typesและเพิ่มลงใน tsconfig.json เพื่อค้นหาประเภทที่ต้องการทั้งหมดจากมัน มันก็เป็นแบบนี้ -

  "typeRoots": [
            "../node_modules/@types",
            "../@types"
        ]

และภายในนั้นฉันได้สร้างไฟล์ชื่อalltypes.d.ts. เพื่อค้นหาประเภทที่ไม่รู้จักจากมัน ดังนั้นสำหรับฉันสิ่งเหล่านี้เป็นประเภทที่ไม่รู้จักและฉันเพิ่มเข้าไปตรงนั้น

declare module 'react-materialize';
declare module 'react-router';
declare module 'flux';

ดังนั้นตอนนี้ typescript ไม่ได้บ่นเกี่ยวกับประเภทที่ไม่พบอีกต่อไป :) ชนะสถานการณ์ตอนนี้ :)


3
ฉันพลาดส่วนที่เกี่ยวกับการอยู่ในไฟล์แยกต่างหาก ดูเหมือนว่าการใส่declareข้อความเหล่านั้นในไฟล์ที่มีชื่อว่าindex.d.tsแก้ไขให้ฉัน ฉันไม่ต้องแตะ typeRoots
Scotty Wagoner

ใช้งานได้ดี แต่ทำให้เกิดปัญหาเมื่อใช้require สำหรับสิ่งอื่น ๆ เช่นรูปภาพ โดยทั่วไปจะไม่อนุญาตให้คุณใช้requireเพื่ออะไร
Dhruvdutt Jadhav

1
โซลูชันนี้ใช้ไม่ได้กับ TS ล่าสุดอีกต่อไป nvalid module name in augmentation. Module 'some-dumb-lib-with-no-types' resolves to an untyped module at '/path/to/module', which cannot be augmented.
FlavourScape

1
สิ่งที่ควรค่าแก่การกล่าวถึง: ขึ้นอยู่กับตำแหน่งของแหล่งที่มาของคุณคุณอาจต้องเพิ่ม "../types" ในอาร์เรย์ "รวม" ของคุณด้วย
netpoetica

1
ฉันมีปัญหากับreact-countdown-clockสร้าง@typesโฟลเดอร์และทำตามขั้นตอนข้างต้นทั้งหมดแล้ว ยังคงได้รับข้อผิดพลาดเดิม
Jyothu

44

ฉันมีปัญหาเดียวกันกับประเภท react-redux วิธีที่ง่ายที่สุดคือเพิ่มลงใน tsconfig.json:

"noImplicitAny": false

ตัวอย่าง:

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "isolatedModules": true,
    "jsx": "react",
    "lib": ["es6"],
    "moduleResolution": "node",
    "noEmit": true,
    "strict": true,
    "target": "esnext",
    "noImplicitAny": false,
  },
  "exclude": ["node_modules", "babel.config.js", "metro.config.js", "jest.config.js"]
}

สิ่งนี้ใช้งานได้ดีในIntelliJIDE แต่typeRootsวิธีการที่กำหนดเอง(ซึ่งเป็นคำตอบที่ยอมรับ) ยังใช้งานได้ในVS CodeIDE
Top-Master

3
ฉันคิดว่านี่เป็นการแฮ็กแม้ว่าวิธีนี้จะช่วยแก้ปัญหาได้ แต่มีวิธีแก้ปัญหาที่ถูกต้องและถาวรสำหรับปัญหานี้หรือไม่?
Pardeep Jain

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดสำหรับปัญหานี้ฉันไม่คิดว่าจะเป็นไปได้ที่จะ npm ฉันทุกแพ็คเกจที่ทำให้เกิดความผิดพลาด
Gilbert R.

30

หากไม่มี@types/<package>โมดูลที่คุณใช้อยู่คุณสามารถหลีกเลี่ยงปัญหาได้อย่างง่ายดายโดยการเพิ่ม// @ts-ignoreความคิดเห็นด้านบนเช่น

// @ts-ignore
import { Navbar, NavItem } from 'react-materialize';

หรือคุณอาจสร้างสิ่ง@types/<package>ต่อไปนี้ที่ขาดหายไป:

การเผยแพร่ไฟล์ประกาศ

พิมพ์ว่าฉันจะมีส่วนร่วมได้อย่างไร


1
แพ็คเกจนี้@typesยังไม่มี BTW สร้างปัญหาบน repo ... github.com/geelen/react-snapshot/issues/131
doublejosh

17

ในกรณีของฉันฉันมีปัญหากับการตอบสนองดังนั้นฉันจึงเริ่มทำ:

npm install @types/react

แล้วไปที่

npm install @types/react-dom

สิ่งนี้ได้ผลสำหรับฉัน


แม้จะยากที่พวกเขาได้รับการติดตั้งแล้วการรันคำสั่งเหล่านั้นอีกครั้งช่วยแก้ปัญหาให้ฉันได้
heringer

โดยทั่วไปจะอัปเดตแพ็กเกจที่มีอยู่ของคุณเมื่อคุณรันคำสั่งอีกครั้ง นั่นคือเหตุผลที่ปัญหาได้รับการแก้ไข
Anant Lalchandani

7

สิ่งที่คุณต้องทำคือเรียกใช้สคริปต์ด้านล่าง จากนั้นถอด / ติดตั้งโมดูลที่คุณต้องการใช้ใหม่

npm install --save @types/react-redux

1
ดูเหมือนว่าจะไม่มี @ types / react-materialize พร้อมใช้งาน
RonLugge

6

ฉันมีปัญหานี้เมื่อฉันเพิ่มลงreact-router-domในแอป CRA ใหม่โดยใช้ typescript หลังจากฉันเพิ่ม@types/react-routerปัญหาได้รับการแก้ไขแล้ว


จะทำอย่างไรหลังจากติดตั้งสิ่งนี้?
Pardeep Jain

5

ฉันมีปัญหาเดียวกันนี้ แต่ไม่จำเป็นต้องเกี่ยวข้องกับ typescript ดังนั้นฉันจึงต้องดิ้นรนเล็กน้อยกับตัวเลือกต่างๆเหล่านี้ ฉันกำลังสร้างแอปสร้างปฏิกิริยาพื้นฐานโดยใช้โมดูลเฉพาะซึ่งreact-portal-tooltip,ได้รับข้อผิดพลาดที่คล้ายกัน:

ไม่พบไฟล์ประกาศสำหรับโมดูล 'react-portal-tooltip' "/node_modules/react-portal-tooltip/lib/index.js" โดยปริยายมีประเภท "ใด ๆ " ลองnpm install @types/react-portal-tooltipว่ามีอยู่หรือเพิ่มไฟล์ประกาศ (.d.ts) ใหม่ที่มีdeclare module 'react-portal-tooltip';ts (7016)

ฉันลองทำหลายขั้นตอนก่อน - เพิ่ม.d.tsไฟล์ต่างๆการติดตั้ง npm ต่างๆ

แต่สิ่งที่ในที่สุดก็ทำงานให้ฉันเป็นtouch src/declare_modules.d.ts แล้วในsrc/declare_modules.d.ts:

declare module "react-portal-tooltip";

และในsrc/App.js:

import ToolTip from 'react-portal-tooltip';
// import './declare_modules.d.ts'

ฉันพยายามเล็กน้อยกับสถานที่ต่างๆเพื่อใช้กลยุทธ์ 'โมดูลประกาศ' ทั่วไป (ฉันเป็นมือใหม่มาก) ดังนั้นฉันคิดว่าสิ่งนี้จะใช้ได้กับตัวเลือกที่แตกต่างกัน แต่ฉันรวมเส้นทางสำหรับสิ่งที่ได้ผล

ตอนแรกฉันคิดว่าimport './declare_modules.d.ts'จำเป็น แม้ว่าตอนนี้จะดูเหมือนไม่ใช่! แต่ฉันกำลังรวมขั้นตอนไว้เผื่อว่าจะช่วยใครบางคนได้

นี่เป็นคำตอบ stackoverflow แรกของฉันดังนั้นฉันจึงขออภัยสำหรับกระบวนการที่กระจัดกระจายที่นี่และหวังว่ามันจะยังคงเป็นประโยชน์! :)


2
นี่เป็นระเบียบและเรียบง่ายจริงๆ ขอบคุณ. ดีแล้วทำต่อไป!
Cubelaster

4

นอกจากนี้ข้อผิดพลาดนี้จะได้รับการแก้ไขหากแพ็คเกจที่คุณพยายามใช้มีไฟล์ประเภทของตัวเองและแสดงอยู่ในแอตทริบิวต์package.json typings

ชอบมาก:

{
  "name": "some-package",
  "version": "X.Y.Z",
  "description": "Yada yada yada",
  "main": "./index.js",

  "typings": "./index.d.ts",

  "repository": "https://github.com/yadayada.git",
  "author": "John Doe",
  "license": "MIT",
  "private": true
}

3

วิธีที่แฮ็คมากขึ้นคือการเพิ่มเช่นใน boot.tsx บรรทัด

import './path/declare_modules.d.ts';

ด้วย

declare module 'react-materialize';
declare module 'react-router';
declare module 'flux';

ใน declare_modules.d.ts

มันใช้งานได้ แต่โซลูชันอื่นดีกว่า IMO


3

สิ่งที่ฉันทำคือเรียกใช้คำสั่งต่อไปนี้จากพรอมต์คำสั่ง nodejs ขณะอยู่ในไดเร็กทอรีโฟลเดอร์โครงการ:

  1. npm init
  2. npm install -g webpack
  3. npm install --save react react-dom @types/react @types/react-dom
  4. npm install --save-dev typescript awesome-typescript-loader source-map-loader
  5. npm install ajv@^6.0.0
  6. npm i react-html-id
  7. นำเข้าแพ็กเกจ (ในโมดูลโหนด) ในไฟล์ App.js โดยการเพิ่มโค้ด: import UniqueId from 'react-html-id';

ฉันทำตามข้างต้น (แม้ว่าฉันจะติดตั้ง npm แล้ว) และมันก็ใช้งานได้!


0

สำหรับกรณีของฉันปัญหาคือประเภทไม่ได้รับการเพิ่มลงในไฟล์ package.json ภายใต้devDependenciesเพื่อแก้ไขฉันเรียกใช้npm install --save-dev @types/react-reduxหมายเหตุ--save-dev



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