TypeScript mendapatkan kesalahan TS2304: tidak dapat menemukan nama 'memerlukan'

463

Saya mencoba untuk mendapatkan aplikasi TypeScript pertama saya dan DefinitelyTyped Node.js dan berjalan, dan mengalami beberapa kesalahan.

Saya mendapatkan kesalahan "TS2304: Tidak dapat menemukan nama 'memerlukan'" ketika saya mencoba untuk mentransformasikan halaman TypeScript Node.js sederhana. Saya telah membaca beberapa kejadian lain dari kesalahan ini pada Stack Overflow, dan saya tidak berpikir saya memiliki masalah yang sama. Saya menjalankan perintah shell prompt:

tsc movie.server.model.ts.

Isi file ini adalah:

'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';

Kesalahan dilemparkan di var mongoose=require('mongoose')telepon.

Isi dari file typings / tsd.d.ts adalah:

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

Referensi file .d.ts ditempatkan di folder yang sesuai dan ditambahkan ke typings / tsd.d.ts dengan perintah:

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

File .js yang diproduksi tampaknya berfungsi dengan baik, jadi saya bisa mengabaikan kesalahan. Tetapi saya akan menghargai mengetahui mengapa kesalahan ini terjadi dan apa yang saya lakukan salah.

JerryKur
sumber
1
when I attempt to transpile a simple ts node page<Bagaimana
kabarmu mentransformasi
1
Saya hanya menjalankan di baris perintah dengan mengetikkan perintah: tsc movie.server.model.ts. FWIW ini ada di Mac.
JerryKur
1
Masalah yang sama juga terjadi di IDE saya menggunakan Visual Studio Code. Saya akan mencobanya IDE saya yang lain, IntelliJ. Saya berasumsi bahwa menjatuhkan ke baris perintah adalah cara terbersih untuk menguji masalah ini.
JerryKur
Bagaimana dengan import { mongoose } from 'mongoose'?
FisNaN

Jawaban:

744

Cepat dan kotor

Jika Anda hanya perlu menggunakan satu file, atau Anda melakukan ini untuk tujuan demo, Anda dapat menentukan persyaratan di bagian atas file TypeScript Anda.

declare var require: any

TypeScript 2.x

Jika Anda menggunakan TypeScript 2.x, Anda tidak perlu lagi menginstal Typings atau Definently Typed. Cukup instal paket berikut.

npm install @types/node --save-dev

The Future of Declaration Files (15/06/2016)

Alat seperti Pengetikan dan tsd akan terus berfungsi, dan kami akan bekerja bersama komunitas tersebut untuk memastikan transisi yang lancar.

Verifikasi atau Edit src Anda /tsconfig.app.json Anda sehingga mengandung yang berikut ini:

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

Pastikan file dalam folder src dan tidak ada pada folder aplikasi root.

Secara default, paket apa pun di @types sudah termasuk dalam build Anda kecuali Anda Anda telah menentukan salah satu dari opsi ini. Baca lebih banyak

TypeScript 1.x

Menggunakan pengetikan (pengganti DefinitelyTyped), Anda dapat menentukan definisi langsung dari repositori GitHub.

Instal pengetikan

npm install typings -g --save-dev

Instal definisi jenis requireJS dari repo DefinitelyType

typings install dt~node --save --global

Paket web

Jika Anda menggunakan Webpack sebagai alat bangun Anda, Anda dapat menyertakan jenis Webpack.

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

Perbarui Anda tsconfig.jsondengan yang berikut ini di bawah compilerOptions:

"types": [
      "webpack-env"
    ]

Ini memungkinkan Anda untuk melakukan require.ensuredan fungsi spesifik Webpack lainnya.

CLI sudut

Dengan CLI Anda dapat mengikuti langkah Webpack di atas dan menambahkan blok "types" ke tsconfig.app.json.

Atau, Anda dapat menggunakan nodejenis yang sudah diinstal sebelumnya . Ingatlah, ini akan mencakup tipe tambahan untuk kode sisi klien Anda yang tidak benar-benar tersedia.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
cgatian
sumber
4
mengapa tidak hanya "mengetik install --save --ambient butuhkan"?
kutomer
1
saya mendapatkan kesalahan dengan ini Unable to find "require" ("npm") in the registry. Apakah memerlukan bagian dari serangkaian besar pengetikan nodeJS?
dcsan
7
i tihnk ini SALAH karena terkait dengan pengetikan untuk requireJS, bukan bawaan node require. mungkin jawaban yang tepat untuk beberapa variasi target output ES5 tetapi tidak pada kasus umum.
dcsan
1
Silakan merujuk ke jordan awnser. Dalam kasus saya, saya telah menginstal @types berikut ini sehingga saya menambahkan -> "types": ["node", "es6-janji", "core-js", "jasmine"] <- ke compilerOptions di tsconfig.json
Lothre1
1
@ Seagull @types/nodeadalah definisi TypeScript. Node tidak termasuk ini, juga tidak seharusnya.
cgatian
103

Untuk TypeScript 2.x , sekarang ada dua langkah:

  1. Instal paket yang mendefinisikan require. Sebagai contoh:

    npm install @types/node --save-dev
  2. Beri tahu TypeScript untuk memasukkannya secara global di tsconfig.json:

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

Langkah kedua hanya penting jika Anda memerlukan akses ke fungsi yang tersedia secara global seperti require. Untuk sebagian besar paket, Anda harus menggunakan import package from 'package'pola. Tidak perlu menyertakan setiap paket dalam larik jenis tsconfig.json di atas.

Yordania
sumber
1
Anda dapat menggunakan lib untuk beberapa es5 github.com/Microsoft/TypeScript/wiki/… Persamaan: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro
Setelah menambahkan "types": ["jasmine", "hammerjs"]untuk tsconfig.jssaya hade untuk menambahkan nodejuga. Terima kasih Jordan.
Mikeumus
Ketika saya mengikuti saran ini, itu merusak semua impor saya. Sebagai contoh, import express from "express";sekarang memberitahu saya bahwa saya perlu mencoba menginstal @ types / express atau menambahkan file .d.ts untuk itu.
austinthemassive
4
Jika Anda memiliki lebih @types/...dari sekedar @types/nodefolder tidak menambahkan "types": ["node"]di tsconfig.jsonkarena naskah compiller akan menghilangkan paket tidak disebutkan lainnya. Ini akan memecah penyelesaian jenis IDE Anda. Itu ditulis di sini typescriptlang.org/docs/handbook/…
Marecky
Solusi itu bekerja untuk saya dalam proyek ionik tanpa masalah, terima kasih :)
Fran Sandi
71

Kamu bisa

declare var require: any

Atau, untuk dukungan yang lebih komprehensif, gunakan DefinitelyTyped's require.d.ts

Selain itu, var mongoose = require('mongoose')Anda dapat mencoba yang berikut ini

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
ᆼ ᆺ ᆼ
sumber
1
Hanya tentang menggunakan use strictdalam TypeScript: jawaban basarat dan "Gunakan Ketat" diperlukan dalam file TypeScript? . Itu perlu untuk digunakan use strictdalam TypeScript.
Eugene Bichel
Hm, menurut jawaban itu tidak perlu tetapi mungkin bermanfaat untuk digunakan "use strict", saya akan mengedit jawaban saya
ᆼ ᆺ ᆼ
menggunakan menyatakan tidak membutuhkan memperbaiki masalah sebenarnya; hanya menyembunyikannya.
My Stack Overfloweth
@ Tidak benar, ingatlah ini dari 2015, dan juga, saya berpendapat tidak ada "masalah" untuk diperbaiki. TypeScript 2.0 sekarang menyelesaikan ini dengan elegan tentunya
ᆼ ᆺ ᆼ
12

Jawaban ini berkaitan dengan pengaturan modern (TypeScript 2.x, Webpack > 2.x)

Anda tidak perlu menginstal @ types / node (yang merupakan semua jenis Node.js dan tidak relevan untuk kode front-end, sebenarnya menyulitkan hal-hal seperti setTimout nilai pengembalian yang berbeda, dll.

Anda lakukan perlu menginstal @ jenis / Webpack-env

npm i -D @types/webpack-env

yang memberikan tanda tangan runtime yang Webpack memiliki (termasuk require, require.ensure, dll)

Juga pastikan bahwa file tsconfig.json Anda tidak memiliki set 'types' array -> yang akan membuatnya mengambil semua definisi tipe dalam folder node_modules / @ types Anda.

Jika Anda ingin membatasi pencarian jenis, Anda dapat mengatur properti typeRoot ke node_modules / @ types.

Nadav SInai
sumber
1
ini adalah komentar yang penting juga memastikan bahwa tsconfig.json Anda tidak memiliki set 'types' array -> yang akan membuatnya mengambil semua definisi tipe di folder node_modules / @ types Anda
Marecky
Apakah ada langkah lain yang diperlukan dengan pendekatan webpack? Saya mendapatkan kesalahan kompilasi `error TS2580: Tidak dapat menemukan nama 'wajib'.
jaycer
10

Dari pada:

'use strict';

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

Mencoba:

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

'use strict';

yaitu jalur referensi pertama.

Badai
sumber
Bekerja, tetapi jenis IMO kotor - pada dasarnya menyembunyikan kesalahan alih-alih memperbaikinya. Sempurna untuk demo dan skrip cepat, tetapi tidak untuk produksi
Nino Filiu
8

Dalam kasus saya, itu adalah masalah yang sangat bodoh, di mana pengaturannya src/tsconfig.app.jsonditimpa tsconfig.json.

Jadi, saya punya ini di tsconfig.json:

    "types": [
      "node"
    ]

Dan yang ini di src/tsconfig.app.json:

    "types": []

Saya harap seseorang menemukan ini bermanfaat, karena kesalahan ini menyebabkan saya uban.

h22a
sumber
8

Hanya untuk referensi, saya menggunakan Angular 7.1.4 , TypeScript 3.1.6 , dan satu-satunya hal yang perlu saya lakukan adalah menambahkan baris ini di tsconfig.json:

    "types": ["node"], // within compilerOptions
Dengarkan
sumber
melakukan itu. Masih mendapat kesalahan ini: Tidak dapat menemukan nama 'wajib'. Apakah Anda perlu menginstal definisi tipe untuk node? Coba npm i @types/nodelalu tambahkan nodeke bidang jenis di tsconfig Anda. - apakah npm menginstal.
Suisse
7

Saya menemukan solusinya adalah dengan menggunakan perintah TSD:

tsd install node --save

Yang menambah / memperbarui typings/tsd.d.tsfile dan file itu berisi semua definisi tipe yang diperlukan untuk aplikasi simpul.

Di bagian atas file saya, saya menaruh referensi tsd.d.tsseperti ini:

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

Persyaratan didefinisikan seperti ini per Januari 2016:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}
AlexStack
sumber
Saya mendapat 404 tidak ditemukan
bormat
5

Saya mengambil jawaban Peter Varga untuk ditambahkan declare var require: any;dan membuatnya menjadi solusi umum yang bekerja untuk semua file .ts secara umum dengan menggunakan preprocess-loader :

  1. pasang preprocessor-loader:

    npm install preprocessor-loader
  2. tambahkan loader ke webpack.config.js Anda (saya menggunakan ts-loader untuk memproses sumber TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Tambahkan konfigurasi yang akan menambahkan solusi ke setiap sumber:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Anda dapat menambahkan yang lebih kuat membutuhkan.d.ts dengan cara yang sama, tetapideclare var require: any; cukup dalam situasi saya.

Catatan, ada bug di preprocessor 1.0.5 , yang memotong baris terakhir, jadi pastikan Anda memiliki ruang garis tambahan kembali di akhir dan Anda akan baik-baik saja.

Benny Bottema
sumber
1
Mengapa ini diturunkan? Itu menjawab pertanyaan dan membawa sesuatu yang baru dan signifikan ke meja. Sekarang Anda tidak perlu memotong-motong setiap file secara individual untuk memenuhi transpiler dan webpack.
Benny Bottema
Bisakah Anda jelaskan langkah 3 lebih lanjut? Saya seorang pemula dan tidak tahu harus meletakkan kode konfigurasi ini di mana.
user441058
@ user441058, checkout halaman GitHub , langkah 3 adalah tentang konfigurasi utama untuk preproses-loader.
Benny Bottema
2

Saya telah berjuang dari masalah ini juga. Saya percaya bahwa ini berfungsi untuk semua kandidat rilis alias rc tetapi saya tidak mengetesnya. Untuk @ segitiga rc.2 berfungsi dengan baik.

  1. Tambahkan core-jssebagai ketergantungan npm dipackage.json
  2. Lari typings install core-js --save
  3. hapus semua "es6-shim"kejadian di blog Anda package.json. Anda tidak membutuhkannya lagi.

Bersulang!

kucherenkovova
sumber
untuk apa core-js mengetik? khusus untuk simpul?
dcsan
2

Pastikan Anda sudah menginstal npm i @types/node

Rupesh Kumar Tiwari
sumber
2

impor * sebagai luwak dari 'luwak'

basquith16
sumber
2

Kadang "melati" yang hilang dari tsconfig.json dapat menyebabkan kesalahan ini. (TypeScript 2.X)

Jadi, tambahkan

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

ke tsconfig.jsonfile Anda .

Samintha Kaveesh
sumber
2

Penambahan Electron + Angular 2/4:

Selain menambahkan tipe 'simpul' ke berbagai file ts.config, yang akhirnya berhasil bagi saya adalah menambahkan yang berikutnya ke typings.d.tsfile:

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

Perhatikan bahwa kasus saya berkembang dengan Elektron + Angular 2/4. Saya membutuhkan persyaratan di jendela global.

mihaa123
sumber
2

Bagi saya itu diselesaikan dengan menambahkan jenis ke opsi kompiler sudut.

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Farida Anjum
sumber
Ada di tsconfig.json untuk siapa pun yang ingin tahu.
Stephen Zeng
1
ini untuk sudut 9.
Arun
1
  1. Apakah Anda menentukan modul apa yang digunakan untuk mengubah kode?
    tsc --target es5 --module commonjs script.ts
    Anda harus melakukan itu untuk memberi tahu transpiler bahwa Anda sedang mengkompilasi kode NodeJS. Documents .

  2. Anda harus menginstal definisi luwak juga
    tsd install mongoose --save

  3. Jangan gunakan varuntuk mendeklarasikan variabel (kecuali perlu, yang merupakan kasus yang sangat langka), gunakan letsaja. Pelajari lebih lanjut tentang itu

Ayman Nedjmeddine
sumber
1

Selain jawaban cgatian , untuk TypeScript 1.x

Jika Anda masih melihat kesalahan, harap berikan index.d.ts secara khusus dalam opsi kompiler Anda.

"files": [
    "typings/index.d.ts"
]
Vidish Datta
sumber
1

Saya tidak bisa mendapatkan kesalahan 'wajib' untuk pergi dengan menggunakan salah satu trik di atas.

Tapi saya menemukan bahwa masalahnya adalah alat TypeScript saya untuk Visual Studio di mana versi lama (1.8.6.0) dan versi terbaru pada hari ini adalah (2.0.6.0).

Anda dapat mengunduh versi alat terbaru dari:

TypeScript untuk Visual Studio 2015

Thomas
sumber
1

Jika Anda dapat mengkompilasi kode, tetapi Visual Studio 2015 menandai fungsi 'wajib' karena kesalahan dengan teks kesalahan tidak dapat menemukan nama 'perlu' atau tidak dapat menyelesaikan simbol 'perlu' wajib , perbarui TypeScript untuk Visual Studio 2015 ke versi terbaru (saat ini 2.1. 5) dan perbarui ReSharper (jika Anda menggunakannya) untuk setidaknya versi 2016.3.2.

Saya memiliki masalah yang mengganggu ini untuk sementara waktu dan tidak dapat menemukan solusi, tetapi saya akhirnya menyelesaikannya dengan cara ini.

Mike Eshva
sumber
1

Tambahkan yang berikut ini di tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]
Darshan Ballal
sumber
2
Ini sudah disebutkan dalam jawaban @ cgatian .
tuomastik
@cgatian telah menyebutkan "node_modules / @ types" sementara saya menyebutkan "../node_modules/@types".
Darshan Ballal
1

Saya sudah jawaban lain yang dibangun di atas semua yang sebelumnya yang menjelaskan npm install @types/nodedan termasuk nodedalam tsconfig.json / compilerOptions / types.

Dalam kasus saya, saya memiliki basis tsConfig.jsondan basis terpisah dalam aplikasi Angular yang memperluas yang ini:

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

Masalah saya adalah kosong typesdalam hal ini tsconfi.app.json- itu clobbers yang ada di konfigurasi dasar.

HankCa
sumber
-2

Jika Anda menghadapi masalah ini dalam file .ts yang hanya ada untuk memberikan Anda beberapa nilai konstan, maka Anda bisa saja

ganti nama file .ts Anda menjadi file .js

dan kesalahan tidak akan datang lagi.

Aavgeen singh
sumber