TypeScript ได้รับข้อผิดพลาด TS2304: ไม่สามารถหาชื่อ 'ต้องการ'


463

ฉันกำลังพยายามรับแอปพลิเคชั่น TypeScript และ DefinitelyTyped Node.js ครั้งแรกของฉันและทำงานและพบข้อผิดพลาดบางอย่าง

ฉันได้รับข้อผิดพลาด "TS2304: ไม่สามารถหาชื่อ 'ต้อง'" เมื่อฉันพยายามที่จะ transpile หน้า TypeScript Node.js ง่าย ๆ ฉันได้อ่านข้อผิดพลาดนี้หลายครั้งใน Stack Overflow และฉันไม่คิดว่าฉันมีปัญหาที่คล้ายกัน ฉันกำลังรันที่ shell prompt พร้อมรับคำสั่ง:

tsc movie.server.model.ts.

เนื้อหาของไฟล์นี้คือ:

'use strict';

/// <reference path="typings/tsd.d.ts" />

/*    movie.server.model.ts - definition of movie schema */

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var foo = 'test';

เกิดข้อผิดพลาดในvar mongoose=require('mongoose')บรรทัด

เนื้อหาของไฟล์ typings / tsd.d.ts คือ:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

การอ้างอิงไฟล์. d.ts ถูกวางไว้ในโฟลเดอร์ที่เหมาะสมและเพิ่มไปยัง typings / tsd.d.ts โดยคำสั่ง:

tsd install node --save
tsd install require --save

ไฟล์. js ที่ผลิตดูเหมือนว่าจะทำงานได้ดีดังนั้นฉันสามารถข้ามข้อผิดพลาดได้ แต่ฉันอยากจะรู้ว่าทำไมข้อผิดพลาดนี้เกิดขึ้นและสิ่งที่ฉันทำผิด


1
when I attempt to transpile a simple ts node page<คุณเป็น
transpiling อย่างไร

1
ฉันเพิ่งทำงานบนบรรทัดคำสั่งโดยพิมพ์คำสั่ง: tsc movie.server.model.ts FWIW นี่คือบน Mac
JerryKur

1
ปัญหาเดียวกันนี้ก็เกิดขึ้นใน IDE I ด้วยการใช้ Visual Studio Code ฉันจะลองใช้ IDE ตัวอื่นของฉัน IntelliJ ฉันคิดว่าการปล่อยลงบรรทัดรับคำสั่งเป็นวิธีที่สะอาดที่สุดในการทดสอบปัญหานี้
JerryKur


แล้วไงimport { mongoose } from 'mongoose'ล่ะ
FisNaN

คำตอบ:


744

รวดเร็วและสกปรก

หากคุณมีไฟล์เพียงไฟล์เดียวที่ต้องการใช้งานหรือคุณกำลังทำสิ่งนี้เพื่อการสาธิตคุณสามารถกำหนดความต้องการที่ด้านบนของไฟล์ TypeScript ของคุณ

declare var require: any

TypeScript 2.x

หากคุณใช้ TypeScript 2.x คุณไม่จำเป็นต้องติดตั้ง Typings หรือ Typical Typical อีกต่อไป เพียงติดตั้งแพ็คเกจต่อไปนี้

npm install @types/node --save-dev

อนาคตของไฟล์คำประกาศ (6/15/2559)

เครื่องมือเช่น Typings และ tsd จะยังคงทำงานต่อไปและเราจะทำงานร่วมกับชุมชนเหล่านั้นเพื่อให้แน่ใจว่าการเปลี่ยนแปลงราบรื่น

ตรวจสอบหรือแก้ไขsrc /tsconfig.app.json ของคุณเพื่อให้มีสิ่งต่อไปนี้:

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

ตรวจสอบให้แน่ใจว่าเป็นไฟล์ในโฟลเดอร์srcและไม่มีไฟล์ในโฟลเดอร์แอปรูท

ตามค่าเริ่มต้นแพ็คเกจใด ๆ ภายใต้ @types จะรวมอยู่ในบิลด์ของคุณแล้วเว้นแต่ว่าคุณได้ระบุตัวเลือกใดตัวเลือกหนึ่งเหล่านี้ อ่านเพิ่มเติม

TypeScript 1.x

การใช้การพิมพ์ (การแทนที่ของ DefinitelyTyped) คุณสามารถระบุคำจำกัดความได้โดยตรงจากที่เก็บ GitHub

ติดตั้งแบบอักษร

npm install typings -g --save-dev

ติดตั้งนิยามประเภท requireJS จาก repo ของ DefinitelyType

typings install dt~node --save --global

Webpack

หากคุณใช้ Webpack เป็นเครื่องมือสร้างของคุณคุณสามารถรวมประเภท Webpack ได้

npm install --save-dev @ types / webpack-env

อัปเดตของคุณtsconfig.jsonด้วยสิ่งต่อไปนี้ภายใต้compilerOptions:

"types": [
      "webpack-env"
    ]

สิ่งนี้ช่วยให้คุณทำrequire.ensureและฟังก์ชั่นเฉพาะของ Webpack อื่น ๆ

CLI เชิงมุม

ด้วย CLI คุณสามารถทำตามขั้นตอนข้างต้น Webpack และเพิ่ม "ประเภท" tsconfig.app.jsonบล็อกของคุณ

หรือคุณสามารถใช้nodeประเภทที่ติดตั้งไว้ล่วงหน้า โปรดทราบว่านี่จะรวมประเภทเพิ่มเติมให้กับรหัสฝั่งไคลเอ็นต์ของคุณที่ไม่สามารถใช้งานได้จริง

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }

4
ทำไมไม่เพียงแค่ "ติดตั้งแบบพิมพ์ - บันทึก - จำเป็นต้องใช้"?
kutomer

1
Unable to find "require" ("npm") in the registryฉันจะได้รับข้อผิดพลาดกับเรื่องนี้ จำเป็นต้องมีส่วนหนึ่งของชุดการพิมพ์ nodeJS ที่ใหญ่ขึ้นหรือไม่?
dcsan

7
ฉันรู้ว่านี่เป็นความผิดที่เกี่ยวข้องกับการพิมพ์สำหรับ requireJS ไม่ใช่โหนดในrequireตัว อาจเป็นคำตอบที่ถูกต้องสำหรับเป้าหมาย ES5 บางรูปแบบ แต่ไม่ใช่กรณีทั่วไป
dcsan

1
โปรดอ้างอิงจอร์แดน awnser ในกรณีของฉันฉันได้ติดตั้ง @types ต่อไปนี้ดังนั้นฉันเพิ่ม -> "types": ["node", "es6-contract", "core-js", "jasmine"] <- to compilerOptions ใน tsconfig.json
Lothre1

1
@Seagull @types/nodeเป็นคำจำกัดความของ TypeScript โหนดไม่รวมสิ่งเหล่านี้และไม่ควร
cgatian

103

สำหรับ TypeScript 2.xขณะนี้มีสองขั้นตอน:

  1. requireติดตั้งแพคเกจที่กำหนด ตัวอย่างเช่น:

    npm install @types/node --save-dev
  2. บอก TypeScript ให้รวมไว้ในtsconfig.json:

    {
        "compilerOptions": {
            "types": ["node"]
        }
    }

requireขั้นตอนที่สองเป็นสิ่งที่สำคัญเท่านั้นถ้าคุณจำเป็นต้องเข้าถึงทั่วโลกฟังก์ชั่นที่สามารถใช้ได้เช่น สำหรับแพ็คเกจส่วนใหญ่คุณควรใช้import package from 'package'ลวดลาย ไม่จำเป็นต้องรวมทุกแพ็คเกจในอาร์เรย์ประเภท tsconfig.json ด้านบน


1
คุณสามารถใช้ lib สำหรับ es5 github.com/Microsoft/TypeScript/wiki/ ...... Eq: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro

หลังจากเพิ่ม"types": ["jasmine", "hammerjs"]ลงไปtsconfig.jsฉันก็เพิ่มnodeอีกเช่นกัน ขอบคุณจอร์แดน
Mikeumus

เมื่อฉันทำตามคำแนะนำนี้มันจะหยุดการนำเข้าทั้งหมดของฉัน ตัวอย่างเช่นimport express from "express";ตอนนี้กำลังบอกฉันว่าฉันต้องลองติดตั้ง @ types / express หรือเพิ่มไฟล์. d.ts
austinthemassive

4
หากคุณมีมากขึ้น@types/...กว่าเพียงแค่@types/nodeโฟลเดอร์ไม่ได้เพิ่ม"types": ["node"]ในtsconfig.jsonเพราะ typescript compiller จะละเว้นแพคเกจอื่น ๆ ที่ไม่ได้กล่าวถึง สิ่งนี้จะทำลายการจำแนกประเภท IDE ของคุณ มันเขียนไว้ที่นี่typescriptlang.org/docs/handbook/…
Marecky

ที่ทำงานแก้ปัญหาสำหรับฉันในโครงการไอออนิกโดยไม่มีปัญหาขอขอบคุณ :)
ฟราน Sandi

71

คุณสามารถ

declare var require: any

หรือสำหรับการสนับสนุนที่ครอบคลุมยิ่งขึ้นให้ใช้DefinitelyTyped's require.d.ts

นอกจากนี้var mongoose = require('mongoose')คุณสามารถลองทำสิ่งต่อไปนี้แทน

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')

1
เกี่ยวกับการใช้use strictใน TypeScript: คำตอบ basaratและ"ใช้ Strict" จำเป็นในไฟล์ TypeScript หรือไม่ . มีความจำเป็นต้องใช้use strictใน TypeScript
Eugene Bichel

อืมตามคำตอบนั้นมันไม่จำเป็น แต่อาจจะมีประโยชน์ในการใช้"use strict"ฉันจะแก้ไขคำตอบของฉัน
ᆼᆺᆼ

ใช้ประกาศต้องการไม่ได้แก้ไขปัญหาจริง; เพียงซ่อนมันไว้
กองซ้อนของฉันล้น

@ ไม่ถูกต้องโปรดจำไว้ว่านี่เป็นปี 2558 และฉันขอยืนยันว่าไม่มี "ปัญหา" ในการแก้ไข TypeScript 2.0 ตอนนี้แก้ปัญหานี้อย่างหรูหรา
ᆼᆺᆼ

12

คำตอบนี้เกี่ยวข้องกับการตั้งค่าที่ทันสมัย ​​(TypeScript 2.x, Webpack > 2.x)

คุณไม่จำเป็นต้องติดตั้ง @ types / node (ซึ่งเป็น Node.js ทุกประเภทและไม่เกี่ยวข้องกับรหัสส่วนหน้าจริง ๆ แล้วสิ่งต่าง ๆ ที่ซับซ้อนเช่น setTimout ค่าตอบแทนที่แตกต่างกัน ฯลฯ

คุณทำจำเป็นต้องติดตั้ง @ ประเภท / webpack-env

npm i -D @types/webpack-env

ซึ่งจะช่วยให้ลายเซ็นรันไทม์ที่มี Webpack (รวมทั้งrequire, require.ensureฯลฯ )

นอกจากนี้ตรวจสอบให้แน่ใจว่าไฟล์ tsconfig.json ของคุณไม่มีชุด 'types' array -> ซึ่งจะทำให้สามารถเลือกนิยามประเภททั้งหมดในโฟลเดอร์ node_modules / @ types ของคุณ

หากคุณต้องการ จำกัด การค้นหาประเภทคุณสามารถตั้งค่าคุณสมบัติ typeRoot เป็น node_modules / @ types


1
นี้เป็นข้อสังเกตที่สำคัญยังให้แน่ใจว่า tsconfig.json ของคุณมีอาร์เรย์ไม่มีชุด 'ประเภท' -> ซึ่งจะทำให้รถกระบะทุกชนิดในคำจำกัดความของคุณ node_modules / @ ประเภทโฟลเดอร์
Marecky

มีขั้นตอนอื่น ๆ อีกหรือไม่ที่จำเป็นสำหรับวิธีการ webpack ฉันพบข้อผิดพลาดในการคอมไพล์ `ข้อผิดพลาด TS2580: ไม่สามารถหาชื่อ 'require'.`
jaycer

10

แทน:

'use strict';

/// <reference path="typings/tsd.d.ts" />

ลอง:

/// <reference path="typings/tsd.d.ts" />

'use strict';

เส้นทางอ้างอิงคือก่อน


ใช้งานได้ แต่ IMO สกปรก - โดยทั่วไปแล้วจะซ่อนข้อผิดพลาดแทนที่จะแก้ไข สมบูรณ์แบบสำหรับการสาธิตและสคริปต์ด่วน แต่ไม่เหมาะสำหรับการผลิต
Nino Filiu

8

ในกรณีของฉันมันเป็นปัญหาที่โง่สุดที่src/tsconfig.app.jsonเป็นเอาชนะtsconfig.jsonการตั้งค่า

ดังนั้นฉันมีสิ่งนี้ในtsconfig.json:

    "types": [
      "node"
    ]

และอันนี้ในsrc/tsconfig.app.json:

    "types": []

ฉันหวังว่าบางคนพบว่ามีประโยชน์นี้เนื่องจากข้อผิดพลาดนี้ทำให้ฉันหงอก


8

สำหรับการอ้างอิงฉันใช้Angular 7.1.4 , TypeScript 3.1.6และสิ่งเดียวที่ฉันต้องทำคือการเพิ่มบรรทัดนี้ในtsconfig.json:

    "types": ["node"], // within compilerOptions

ทำอย่างนั้น ยังคงมีข้อผิดพลาดนี้: ไม่พบชื่อ 'ต้องการ' คุณต้องการติดตั้งนิยามชนิดสำหรับโหนดหรือไม่? ลองnpm i @types/nodeแล้วเพิ่มลงnodeในฟิลด์ประเภทใน tsconfig ของคุณ - ทำการติดตั้ง npm
สวิส

7

ฉันพบวิธีแก้ไขคือใช้คำสั่ง TSD:

tsd install node --save

ซึ่งเพิ่ม / อัพเดตtypings/tsd.d.tsไฟล์และไฟล์นั้นมีนิยามชนิดทั้งหมดที่จำเป็นสำหรับโหนดแอ็พพลิเคชัน

ที่ด้านบนของไฟล์ของฉันฉันใส่การอ้างอิงถึงสิ่งtsd.d.tsนี้:

/// <reference path="../typings/tsd.d.ts" />

ความต้องการถูกกำหนดเช่นนี้ ณ เดือนมกราคม 2559:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}

ผมได้ 404 ไม่พบ
bormat

5

ฉันใช้คำตอบของ Peter Vargaเพื่อเพิ่มdeclare var require: any;และทำให้เป็นโซลูชันทั่วไปที่ใช้ได้กับไฟล์. ts ทั้งหมดโดยใช้preprocess-loader :

  1. ติดตั้ง preprocessor-loader:

    npm install preprocessor-loader
  2. เพิ่มตัวโหลดไปยังwebpack.config.jsของคุณ(ฉันกำลังใช้ตัวโหลด tsสำหรับการประมวลผลแหล่งที่มาของ TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. เพิ่มการกำหนดค่าที่จะเพิ่มการแก้ปัญหาให้กับทุกแหล่งที่มา:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

คุณสามารถเพิ่มrequire.d.tsที่แข็งแกร่งกว่าในลักษณะเดียวกัน แต่declare var require: any;ก็เพียงพอแล้วในสถานการณ์ของฉัน

หมายเหตุมีข้อผิดพลาดในตัวประมวลผลล่วงหน้า 1.0.5ซึ่งตัดบรรทัดสุดท้ายดังนั้นให้ตรวจสอบให้แน่ใจว่าคุณได้คืนพื้นที่ว่างในบรรทัดพิเศษในตอนท้ายและคุณจะไม่เป็นไร


1
ทำไมเรื่องนี้จึงถูกลดระดับลง มันตอบคำถามและนำสิ่งใหม่และมีความสำคัญกับตาราง ตอนนี้คุณไม่ต้องทำการรวมไฟล์ทุกไฟล์เข้าด้วยกันเพื่อสร้างความพึงพอใจให้กับ transpiler และ webpack
Benny Bottema

คุณช่วยอธิบายขั้นตอนที่ 3 เพิ่มเติมได้ไหม ฉันเป็นคนใหม่และไม่รู้ว่าจะวางรหัสการกำหนดค่านี้ไว้ที่ไหน
user441058

@ user441058 ชำระเงินหน้า GitHubขั้นตอนที่ 3 เกี่ยวกับการกำหนดค่าหลักสำหรับตัวประมวลผลล่วงหน้า
Benny Bottema

2

ฉันได้รับการดิ้นรนจากปัญหานี้เช่นกัน ฉันเชื่อว่าสิ่งนี้ใช้ได้กับผู้สมัครรุ่น aka rcแต่ฉันไม่ได้ทดสอบก็คือ สำหรับ@angular rc.2มันทำงานได้ดี

  1. เพิ่มcore-jsเป็นการพึ่งพา npm ในpackage.json
  2. วิ่ง typings install core-js --save
  3. ลบทั้งหมด"es6-shim"occurances package.jsonในของคุณ คุณไม่ต้องการมันอีกต่อไป

ไชโย!


core-js นั้นมีไว้เพื่ออะไร? เฉพาะโหนด?
dcsan



2

บางครั้งไม่มี "jasmine" จาก tsconfig.json อาจทำให้เกิดข้อผิดพลาดนี้ (TypeScript 2.X)

ดังนั้นเพิ่ม

"types": [
  "node",
  "jasmine"
]

ไปยังtsconfig.jsonไฟล์ของคุณ


2

การเติมอิเล็กตรอน + เชิงมุม 2/4:

ด้านบนของการเพิ่ม 'โหนด' ชนิดลงใน ts.config ไฟล์ต่าง ๆ สิ่งที่ใช้งานได้ในที่สุดสำหรับฉันคือการเพิ่มถัดจาก typings.d.tsไฟล์:

declare var window: Window;
interface Window {
  process: any;
  require: any;
}

โปรดทราบว่ากรณีของฉันกำลังพัฒนาด้วย Electron + Angular 2/4 ฉันต้องการสิ่งที่ต้องการบนหน้าต่างทั่วโลก


2

สำหรับฉันมันได้รับการแก้ไขโดยการเพิ่มประเภทให้กับตัวเลือกคอมไพเลอร์เชิงมุม

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}

มันอยู่ใน tsconfig.json สำหรับทุกคนที่ต้องการรู้
Stephen Zeng

1
สำหรับเชิงมุม 9
อรุณ

1
  1. คุณระบุโมดูลที่จะใช้ในการส่งรหัสหรือไม่
    tsc --target es5 --module commonjs script.ts
    คุณต้องทำอย่างนั้นเพื่อให้ transpiler รู้ว่าคุณกำลังรวบรวมรหัส NodeJS เอกสาร

  2. คุณต้องติดตั้งคำจำกัดความพังพอนเช่นกัน
    tsd install mongoose --save

  3. อย่าใช้varเพื่อประกาศตัวแปร (เว้นแต่จำเป็นซึ่งเป็นกรณีที่หายากมาก) ให้ใช้letแทน เรียนรู้เพิ่มเติมเกี่ยวกับสิ่งนั้น


1

นอกเหนือจากคำตอบของcgatianสำหรับTypeScript 1.x

หากคุณยังคงเห็นข้อผิดพลาดโปรดระบุ index.d.ts ในตัวเลือกคอมไพเลอร์ของคุณ

"files": [
    "typings/index.d.ts"
]

1

ฉันไม่สามารถรับข้อผิดพลาด 'need' ที่จะหายไปโดยใช้เทคนิคใด ๆ ข้างต้น

แต่ฉันพบว่าปัญหาคือเครื่องมือ TypeScript ของฉันสำหรับ Visual Studio ซึ่งเป็นรุ่นเก่า (1.8.6.0) และรุ่นล่าสุด ณ วันนี้คือ (2.0.6.0)

คุณสามารถดาวน์โหลดเครื่องมือเวอร์ชันล่าสุดได้จาก:

TypeScript สำหรับ Visual Studio 2015


1

ถ้าคุณสามารถคอมไพล์โค้ดได้ แต่ Visual Studio 2015 ทำเครื่องหมายว่า 'ต้องการ' ฟังก์ชั่นเนื่องจากข้อผิดพลาดที่มีข้อความแสดงข้อผิดพลาดไม่สามารถหาชื่อ 'ต้องการ'หรือไม่สามารถแก้ไขสัญลักษณ์ 'ต้องการ' ได้ให้อัพเดต TypeScript สำหรับ Visual Studio 2015 เป็นเวอร์ชั่นล่าสุด 5) และอัปเดต ReSharper (ถ้าคุณใช้) เป็นอย่างน้อยเวอร์ชัน 2016.3.2

ฉันมีปัญหาที่น่ารำคาญมาระยะหนึ่งแล้วหาทางออกไม่ได้ แต่ในที่สุดฉันก็แก้ไขได้ด้วยวิธีนี้


1

เพิ่มสิ่งต่อไปนี้ในtsconfig.json:

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

2
นี้เป็นที่กล่าวถึงแล้วในของ @ cgatian คำตอบ
tuomastik

@cgatian ได้กล่าวถึง "node_modules / @ types" ในขณะที่ฉันพูดถึง "../node_modules/@types"
Darshan Ballal

1

ฉันยังคำตอบที่สร้างเมื่อทุกคนก่อนหน้าที่อธิบายอื่นnpm install @types/nodeและรวมทั้งในnodetsconfig.json / compilerOptions / types

ในกรณีของฉันฉันมีฐานtsConfig.jsonและอีกอันหนึ่งในแอปพลิเคชัน Angular ที่ขยายอันนี้:

{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": []
 },

ปัญหาของฉันคือสิ่งที่ว่างเปล่าtypesในนี้tsconfi.app.json- มันอุดตันหนึ่งในการกำหนดค่าฐาน


-2

หากคุณประสบปัญหานี้ในไฟล์. ts ซึ่งมีไว้เพื่อให้คุณมีค่าคงที่คุณก็สามารถทำได้

เปลี่ยนชื่อไฟล์. ts เป็นไฟล์. js

และความผิดพลาดจะไม่กลับมาอีก

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