Lỗi typeScript nhận được TS2304: không thể tìm thấy tên 'yêu cầu'


463

Tôi đang cố gắng để ứng dụng TypeScript và DefiniteTyped Node.js đầu tiên của tôi chạy và chạy và gặp một số lỗi.

Tôi đang gặp lỗi "TS2304: Không thể tìm thấy tên 'yêu cầu'" khi tôi cố gắng dịch mã một trang TypeScript Node.js đơn giản. Tôi đã đọc qua một số lần xuất hiện khác của lỗi này trên Stack Overflow và tôi không nghĩ mình gặp vấn đề tương tự. Tôi đang chạy tại shell nhắc lệnh:

tsc movie.server.model.ts.

Nội dung của tập tin này là:

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

Các lỗi được ném trên var mongoose=require('mongoose')dòng.

Nội dung của tệp typings / tsd.d.ts là:

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

Các tham chiếu tệp .d.ts được đặt trong các thư mục thích hợp và được thêm vào typings / tsd.d.ts bằng các lệnh:

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

Tệp .js được sản xuất có vẻ hoạt động tốt, vì vậy tôi có thể bỏ qua lỗi. Nhưng tôi sẽ đánh giá cao việc biết tại sao lỗi này xảy ra và những gì tôi đang làm sai.


1
when I attempt to transpile a simple ts node page<bạn đang dịch chuyển như thế nào ... tiện ích nào
basarat

1
Tôi chỉ chạy trên dòng lệnh bằng cách gõ lệnh: tsc movie.server.model.ts. FWIW này là trên máy Mac.
JerryKur

1
Vấn đề tương tự cũng xảy ra trong IDE tôi đang sử dụng Visual Studio Code. Tôi sẽ thử nó IDE khác của tôi, IntelliJ. Tôi giả định rằng thả xuống dòng lệnh là cách sạch nhất để kiểm tra vấn đề này.
JerryKur


Thế còn import { mongoose } from 'mongoose'?
FisNaN

Câu trả lời:


744

Nhanh chóng và hèn hạ

Nếu bạn chỉ có một tệp sử dụng yêu cầu hoặc bạn đang làm điều này cho mục đích demo, bạn có thể xác định yêu cầu ở đầu tệp TypeScript của mình.

declare var require: any

TypeScript 2.x

Nếu bạn đang sử dụng TypeScript 2.x, bạn không còn cần phải cài đặt Bản in hoặc Nhập chắc chắn. Đơn giản chỉ cần cài đặt gói sau.

npm install @types/node --save-dev

Tương lai của tập tin khai báo (ngày 15 tháng 6 năm 2016)

Các công cụ như typings và tsd sẽ tiếp tục hoạt động và chúng tôi sẽ làm việc cùng với các cộng đồng đó để đảm bảo quá trình chuyển đổi suôn sẻ.

Xác minh hoặc Chỉnh sửa src /tsconfig.app.json của bạn để nó chứa các mục sau:

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

Đảm bảo là tệp trong thư mục src và không có tệp nào trong thư mục ứng dụng gốc.

Theo mặc định, mọi gói trong @types đã được bao gồm trong bản dựng của bạn trừ khi bạn đã chỉ định một trong các tùy chọn này. Đọc thêm

TypeScript 1.x

Sử dụng các kiểu chữ (thay thế của DefiniteTyped), bạn có thể chỉ định một định nghĩa trực tiếp từ kho lưu trữ GitHub.

Cài đặt kiểu chữ

npm install typings -g --save-dev

Cài đặt định nghĩa loại requestJS từ repo của DefiniteType

typings install dt~node --save --global

Gói web

Nếu bạn đang sử dụng Webpack làm công cụ xây dựng, bạn có thể bao gồm các loại Webpack.

cài đặt npm --save-dev @ type / webpack-env

Cập nhật của bạn tsconfig.jsonvới những điều sau đây compilerOptions:

"types": [
      "webpack-env"
    ]

Điều này cho phép bạn làm require.ensurevà các chức năng cụ thể khác của Webpack.

CLI góc

Với CLI, bạn có thể làm theo bước Webpack ở trên và thêm khối "loại" vào tsconfig.app.json.

Ngoài ra, bạn có thể sử dụng các nodeloại cài đặt sẵn . Hãy ghi nhớ điều này sẽ bao gồm các loại bổ sung cho mã phía máy khách của bạn không thực sự có sẵn.

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

4
Tại sao không chỉ là "typings install --save --ambient yêu cầu"?
kutome

1
tôi nhận được một lỗi với điều này Unable to find "require" ("npm") in the registry. Có yêu cầu một phần của một tập hợp các kiểu đánh dấu nodeJS lớn hơn không?
dcsan

7
i tihnk đây là SAU vì nó liên quan đến việc đánh máy cho các yêu cầu, không phải là nút được tích hợp require. có thể câu trả lời đúng của nó cho một số biến thể của mục tiêu đầu ra ES5 nhưng không phải là trường hợp chung.
dcsan

1
Vui lòng tham khảo jordan awnser. Trong trường hợp của tôi, tôi đã cài đặt @types sau đây vì vậy tôi đã thêm -> "type": ["nút", "es6-lời hứa", "core-js", "jasmine"] <- vào trình biên dịchOptions trong tsconfig.json
Lothre1

1
@Seagull @types/nodelà các định nghĩa TypeScript . Nút không bao gồm những thứ này, cũng không nên.
cgatian

103

Đối với TypeScript 2.x , hiện có hai bước:

  1. Cài đặt một gói xác định require. Ví dụ:

    npm install @types/node --save-dev
  2. Nói với TypeScript để đưa nó vào toàn cầu trong tsconfig.json:

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

Bước thứ hai chỉ quan trọng nếu bạn cần truy cập vào các chức năng có sẵn trên toàn cầu như require. Đối với hầu hết các gói, bạn chỉ nên sử dụng import package from 'package'mẫu. Không cần bao gồm mọi gói trong mảng loại tsconfig.json ở trên.


1
Bạn có thể sử dụng lib đối với một số ES5 github.com/Microsoft/TypeScript/wiki/... Eq: "lib": [ "dom", "ES5", "es2015.promise", "es2015.collection"]
Leo Caseiro

Sau khi thêm "types": ["jasmine", "hammerjs"]vào tsconfig.jstôi hade để thêm nodelà tốt. Cảm ơn Jordan.
Mikeumus

Khi tôi làm theo lời khuyên này, nó sẽ phá vỡ tất cả hàng nhập khẩu của tôi. Ví dụ, import express from "express";hiện đang nói với tôi rằng tôi cần thử cài đặt @ type / express hoặc thêm tệp .d.ts cho nó.
austinthemassive

4
Nếu bạn có nhiều @types/...hơn chỉ @types/nodethư mục, đừng thêm "types": ["node"]vào tsconfig.jsonvì trình biên dịch TypeScript sẽ bỏ qua các gói không được đề cập khác. Điều này sẽ phá vỡ các loại IDE của bạn giải quyết. Nó được viết ở đây typescriptlang.org/docs/handbook/...
Marecky

Giải pháp đó hiệu quả với tôi trong một dự án ion mà không gặp vấn đề gì, cảm ơn bạn :)
Fran Sandi

71

Bạn có thể

declare var require: any

Hoặc, để được hỗ trợ toàn diện hơn, hãy sử dụng các yêu cầu của DefiniteTyped

Ngoài ra, thay vì var mongoose = require('mongoose'), bạn có thể thử như sau

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

1
Chỉ cần sử dụng use stricttrong TypeScript : basarat answersử dụng Strict 'cần thiết trong một tệp TypeScript? . Nó là cần thiết để sử dụng use stricttrong TypeScript.
Eugene Bíchel

Hừm, theo câu trả lời đó thì không cần thiết nhưng có thể có ích khi sử dụng "use strict", tôi sẽ chỉnh sửa câu trả lời của mình
ᆼ ᆺ 2/12/2015

sử dụng khai báo var yêu cầu không khắc phục vấn đề thực sự; chỉ cần che giấu nó
Ngăn xếp của tôi tràn vào

@Ant đúng, hãy nhớ rằng đây là từ năm 2015, và đồng thời, tôi cho rằng không có "vấn đề" nào cần khắc phục. Tất nhiên
TypeScript

12

Câu trả lời này liên quan đến các thiết lập hiện đại (TypeScript 2.x, Webpack > 2.x)

Bạn không cần phải cài đặt @ type / node (tất cả các loại Node.js và không liên quan đến mã mặt trước, thực sự làm phức tạp những thứ như setTimout các giá trị trả về khác nhau, v.v.

Bạn làm cần phải cài đặt @ loại / webpack-env

npm i -D @types/webpack-env

mang đến cho chữ ký runtime rằng Webpack có (bao gồm require, require.ensure, vv)

Ngoài ra, hãy đảm bảo rằng tệp tsconfig.json của bạn không có mảng 'type' được đặt -> sẽ làm cho nó lấy tất cả các định nghĩa kiểu trong thư mục node_modules / @ type của bạn.

Nếu bạn muốn hạn chế tìm kiếm các loại, bạn có thể đặt thuộc tính typeRoot thành loại node_modules / @.


1
đây cũng là một nhận xét quan trọng, đảm bảo rằng tsconfig.json của bạn không có mảng 'loại' nào được đặt -> sẽ làm cho nó lấy tất cả các định nghĩa kiểu trong thư mục node_modules / @ type của bạn
Marecky

Có bất kỳ bước nào khác cần thiết với cách tiếp cận webpack không? Tôi nhận được một lỗi biên dịch `lỗi TS2580: Không thể tìm thấy tên 'request'.`
jaycer

10

Thay vì:

'use strict';

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

Thử:

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

'use strict';

tức là đường dẫn tham chiếu trước.


Hoạt động, nhưng loại IMO bẩn - về cơ bản nó che giấu lỗi thay vì sửa nó. Hoàn hảo cho các bản demo và kịch bản nhanh, nhưng không dành cho sản xuất
Nino Filiu

8

Trong trường hợp của tôi, đó là một vấn đề siêu ngu ngốc, trong đó việc ghi src/tsconfig.app.jsonđè tsconfig.jsoncài đặt.

Vì vậy, tôi đã có điều này trong tsconfig.json:

    "types": [
      "node"
    ]

Và cái này trong src/tsconfig.app.json:

    "types": []

Tôi hy vọng ai đó thấy điều này hữu ích, vì lỗi này đã gây ra cho tôi những sợi tóc bạc.


8

Chỉ để tham khảo, tôi đang sử dụng Angular 7.1.4 , TypeScript 3.1.6 và điều duy nhất tôi cần làm là thêm dòng này vào tsconfig.json:

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

đã làm điều đó. Vẫn gặp lỗi này: Không thể tìm thấy tên 'yêu cầu'. Bạn có cần phải cài đặt định nghĩa loại cho nút? Hãy thử npm i @types/nodevà sau đó thêm nodevào trường loại trong tsconfig của bạn. - đã cài đặt npm.
Suisse

7

Tôi tìm thấy giải pháp là sử dụng lệnh TSD:

tsd install node --save

Mà thêm / cập nhật typings/tsd.d.tstệp và tệp đó chứa tất cả các định nghĩa loại được yêu cầu cho một ứng dụng nút.

Ở đầu tập tin của tôi, tôi đặt một tham chiếu tsd.d.tsnhư sau:

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

Yêu cầu được xác định như thế này vào tháng 1 năm 2016:

declare var require: NodeRequire;

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

Tôi đã nhận được 404 không tìm thấy
bormat

5

Tôi đã lấy câu trả lời của Peter Varga để thêm declare var require: any;và biến nó thành một giải pháp chung hoạt động cho tất cả các tệp .ts một cách khái quát bằng cách sử dụng trình nạp tiền xử lý :

  1. cài đặt bộ nạp tiền xử lý:

    npm install preprocessor-loader
  2. thêm trình tải vào webpack.config.js (Tôi đang sử dụng trình tải ts để xử lý các nguồn TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Thêm cấu hình sẽ thêm cách giải quyết cho mọi nguồn:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Bạn có thể thêm các yêu cầu mạnh mẽ hơn theo cách tương tự, nhưng declare var require: any;là đủ trong tình huống của tôi.

Lưu ý, có một lỗi trong bộ tiền xử lý 1.0.5 , nó cắt đứt dòng cuối cùng, vì vậy chỉ cần đảm bảo rằng bạn có thêm một khoảng trống dòng trở lại ở cuối và bạn sẽ ổn.


1
Tại sao điều này bị hạ cấp? Nó trả lời câu hỏi và mang lại một cái gì đó mới và có ý nghĩa cho bảng. Bây giờ bạn không phải đọc từng tệp riêng lẻ để đáp ứng bộ chuyển mã và gói web.
Benny Bottema

Bạn có thể giải thích bước 3 hơn không? Tôi là người mới và không biết đặt mã cấu hình này ở đâu.
dùng441058

@ user441058, kiểm tra trang GitHub , bước 3 là về cấu hình chính cho trình tải trước tiền xử lý.
Benny Bottema

2

Tôi cũng đang vật lộn từ vấn đề này. Tôi tin rằng điều này hoạt động cho tất cả các ứng cử viên phát hành hay còn gọi là RC nhưng tôi đã không kiểm tra. Đối với @angular RC.2, nó hoạt động tốt.

  1. Thêm core-jsphụ thuộc npm vàopackage.json
  2. chạy typings install core-js --save
  3. loại bỏ tất cả các lần "es6-shim"xuất hiện trong của bạn package.json. Bạn không cần nó nữa.

Chúc mừng!


các kiểu chữ core-js để làm gì? cụ thể cho nút?
dcsan



2

Đôi khi thiếu "hoa nhài" từ tsconfig.json có thể gây ra lỗi này. (TypeScript 2.X)

Vì vậy, thêm

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

vào tsconfig.jsontập tin của bạn .


2

Bổ sung điện tử + góc 2/4:

Ngoài việc thêm loại 'nút' vào ts.config các tệp khác nhau, điều cuối cùng làm việc với tôi là thêm typings.d.tstệp tiếp theo vào tệp:

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

Lưu ý rằng trường hợp của tôi đang phát triển với Electron + Angular 2/4. Tôi cần các yêu cầu trên cửa sổ toàn cầu.


2

Đối với tôi, nó được giải quyết bằng cách thêm các loại vào các tùy chọn trình biên dịch góc.

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

Đó là trong tsconfig.json cho bất cứ ai muốn biết.
Stephen Zeng

1
đây là cho góc 9.
Arun

1
  1. Bạn đã chỉ định mô-đun nào sẽ sử dụng để dịch mã?
    tsc --target es5 --module commonjs script.ts
    Bạn phải làm điều đó để cho bộ chuyển đổi biết rằng bạn đang biên dịch mã NodeJS. Tài liệu .

  2. Bạn cũng phải cài đặt định nghĩa mongoose
    tsd install mongoose --save

  3. Không sử dụng varđể khai báo các biến (trừ khi cần thiết, đây là trường hợp rất hiếm), letthay vào đó hãy sử dụng . Tìm hiểu thêm về điều đó


1

Ngoài câu trả lời của cgatian, cho TypeScript 1.x

Nếu bạn vẫn thấy lỗi, vui lòng cung cấp cụ thể index.d.ts trong các tùy chọn trình biên dịch của bạn.

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

1

Tôi không thể loại bỏ lỗi 'yêu cầu' bằng cách sử dụng bất kỳ thủ thuật nào ở trên.

Nhưng tôi phát hiện ra rằng vấn đề là các công cụ TypeScript của tôi cho Visual Studio có phiên bản cũ (1.8.6.0) và phiên bản mới nhất cho đến ngày hôm nay là (2.0.6.0).

Bạn có thể tải xuống phiên bản mới nhất của các công cụ từ:

TypeScript cho Visual Studio 2015


1

Nếu bạn có thể biên dịch mã, nhưng Visual Studio 2015 đánh dấu 'yêu cầu' các chức năng là lỗi có văn bản lỗi không thể tìm thấy tên 'yêu cầu' hoặc không thể giải quyết biểu tượng 'yêu cầu' , hãy cập nhật TypeScript cho Visual Studio 2015 lên phiên bản mới nhất (tại thời điểm 2.1. 5) và cập nhật ReSharper (nếu bạn sử dụng nó) lên ít nhất là phiên bản 2016.3.2.

Tôi đã có vấn đề gây phiền nhiễu này trong một thời gian và không thể tìm ra giải pháp, nhưng cuối cùng tôi đã giải quyết nó theo cách này.


1

Thêm vào như sau tsconfig.json:

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

2
Điều này đã được đề cập trong câu trả lời của @ cgatian .
tuomastik

@cgatian đã đề cập đến "node_modules / @ type" trong khi tôi đã đề cập "../node_modules/@types".
Darshan Ballal

1

Tôi chưa một câu trả lời rằng xây dựng dựa trên tất cả những người trước đây mô tả npm install @types/nodevà bao gồm nodetrong tsconfig.json / compilerOptions / types.

Trong trường hợp của tôi, tôi có một cơ sở tsConfig.jsonvà một cơ sở riêng trong ứng dụng Angular mở rộng cái này:

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

Vấn đề của tôi là sự trống rỗng typestrong điều này tsconfi.app.json- nó làm tắc nghẽn cái trong cấu hình cơ sở.


-2

Nếu bạn đang phải đối mặt với vấn đề này trong tệp .ts chỉ có ở đó để cung cấp cho bạn một số giá trị không đổi, thì bạn chỉ có thể

đổi tên tệp .ts của bạn thành tệp .js

và lỗi sẽ không trở lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.