Помилка отримання TypeScript TS2304: не вдається знайти ім'я "вимагати"


463

Я намагаюся запустити свою першу програму TypeScript і DefinitelyTyped Node.js і запустити деякі помилки.

Я отримую помилку "TS2304: Не можу знайти ім'я" вимагати ", коли я намагаюся перекласти просту сторінку TypeScript Node.js. Я прочитав кілька інших випадків цієї помилки в Stack Overflow, і не думаю, що у мене є подібні проблеми. Я виконую команду:

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')рядок.

Вміст файлу typing / tsd.d.ts:

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

Посилання на файли .d.ts були поміщені у відповідні папки та додані до команд типінгу / tsd.d.ts командами:

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

Здається, що файл .js здається відмінним, тому я можу проігнорувати помилку. Але я вдячний, знаючи, чому виникає ця помилка і що я роблю неправильно.


1
when I attempt to transpile a simple ts node page<як ти перекладаєш ... яка утиліта
basarat

1
Я просто запускаю в командному рядку, ввівши команду: tsc movie.server.model.ts. FWIW це на Mac.
JerryKur

1
Ця ж проблема виникала і в IDE, який я використовував Visual Studio Code. Я спробую це мій інший IDE, IntelliJ. Я припускав, що перехід до командного рядка був найчистішим способом перевірити цю проблему.
JerryKur


Як щодо import { mongoose } from 'mongoose'?
FisNaN

Відповіді:


744

Швидкий і брудний

Якщо у вас просто один файл, використовуючи затребуване, або ви робите це для демонстраційних цілей, ви можете визначити вимагати вгорі файлу TypeScript.

declare var require: any

TypeScript 2.x

Якщо ви використовуєте TypeScript 2.x, вам більше не потрібно встановлювати типи або певно введені. Просто встановіть наступний пакет.

npm install @types/node --save-dev

Майбутнє файлів декларацій (15.06.2016)

Такі інструменти, як Typeings і tsd, продовжуватимуть працювати, і ми будемо працювати разом із цими спільнотами, щоб забезпечити плавний перехід.

Перевірте або відредагуйте src /tsconfig.app.json, щоб він містив наступне:

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

Переконайтеся, що файл у папці src, а не той у кореневій папці програми.

За замовчуванням будь-який пакет під @types вже включений у вашу збірку, якщо ви не вказали жоден із цих параметрів. Детальніше

TypeScript 1.x

Використовуючи типізацію (заміну DefinitelyTyped), ви можете вказати визначення безпосередньо з сховища GitHub.

Встановіть типізацію

npm install typings -g --save-dev

Встановіть визначення типу RequJS з репо-файлу DefinitelyType

typings install dt~node --save --global

Вебпак

Якщо ви використовуєте 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
чому б не просто "типінг встановити - зберегти - потрібен навколишній"?
кутомер

1
я отримую помилку з цим Unable to find "require" ("npm") in the registry. Чи потрібна частина більшого набору типи nodeJS?
dcsan

7
я tihnk це WRONG, оскільки пов'язаний з типізацією для RequJS, а не вбудований вузол require. можливо, її правильна відповідь на деяку зміну вихідної цілі ES5, але не загальний випадок.
dcsan

1
Зверніться до Йордана Аунсера. У моєму випадку я встановив такі @types, тому я додав -> "type": ["вузол", "es6-обіцянка", "core-js", "жасмін"] <- до компілятораОпції в 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": [ "Будинок", "ES5", "es2015.promise", "es2015.collection"]
Лео Caseiro

Після додавання "types": ["jasmine", "hammerjs"]до tsconfig.jsя майстрував додати nodeв колодязі. Дякую Йордану.
Mikeumus

Коли я дотримуюся цієї поради, вона порушує весь мій імпорт. Наприклад, import express from "express";зараз мені кажуть, що мені потрібно спробувати встановити @ types / express або додати до нього файл .d.ts.
австрійськемасивне

4
Якщо у Вас є більш @types/...ніж просто @types/nodeпапка не додавати "types": ["node"]в tsconfig.jsonтому , що машинопис compiller опускає інші , які не йдеться пакети. Це дозволить розірвати ваші типи ідентифікаційних файлів. Це написано тут typescriptlang.org/docs/handbook / ...
Marecky

Це рішення працює для мене в іонному проекті без проблем, дякую :)
Френ Санді

71

Ти можеш

declare var require: any

Або для більш всебічної підтримки використовуйте DefinitelyTyped's Requ.d.ts

Також замість цього var mongoose = require('mongoose')можна спробувати наступне

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

1
Тільки про використання use strictв TypeScript: відповіді basarat та "Use Strict", необхідних у файлі TypeScript? . Необхідно використовувати use strictв TypeScript.
Євген Біхель

Гм, відповідно до цієї відповіді це не потрібно, але це може бути корисно використовувати "use strict", я відредагую свою відповідь
ᆼ ᆺ ᆼ

використання заяви var не потребує виправлення реальної проблеми; просто приховуючи це.
Мій стек переповнюється

@ Правильно, майте на увазі, що це з 2015 року, а також, я б стверджував, що немає жодної проблеми з виправленням. Тепер TypeScript 2.0 вирішує це елегантно, звичайно,
ᆼ ᆺ ᆼ

12

Ця відповідь стосується сучасних налаштувань (TypeScript 2.x, Webpack > 2.x)

Вам не потрібно встановлювати @ types / node (який є всіма типами Node.js і не має значення для переднього коду, фактично ускладнюючи такі речі, як setTimout різні значення повернення тощо).

Ви робите необхідність установки @ типів / WebPack-окр

npm i -D @types/webpack-env

яка дає підпис під час виконання , що Webpack має ( в тому числі require, require.ensureі т.д.)

Також переконайтесь, що у вашому файлі tsconfig.json немає встановленого масиву "types" ->, що змусить його підбирати всі визначення типів у вашій папці node_modules / @ types.

Якщо ви хочете обмежити пошук типів, ви можете встановити для властивості typeRoot значення node_modules / @.


1
це важливе зауваження також переконайтесь, що у вашому tsconfig.json немає встановленого масиву "type" ->, що змусить його підбирати всі визначення типів у вашій папці node_modules / @ types
Marecky,

Чи потрібні інші кроки із підходом до веб-пакету? Я отримую помилку компіляції `помилка TS2580: Не вдалося знайти ім'я 'вимагаю' '
jaycer

10

Замість:

'use strict';

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

Спробуйте:

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

'use strict';

тобто спочатку шлях.


Працює, але свого роду брудний IMO - він в основному приховує помилку замість виправлення. Ідеально підходить для демонстрацій та швидких сценаріїв, але не для виробництва
Ніно Філіу

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.
Suisse

7

Я знайшов рішення - використовувати команду TSD:

tsd install node --save

Що додає / оновлює typings/tsd.d.tsфайл, а цей файл містить усі визначення типу, необхідні для програми вузла.

У верхній частині мого файлу я ставлю посилання на tsd.d.tsподібне:

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

Вимога визначається так станом на січень 2016 року:

declare var require: NodeRequire;

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

У мене 404 не знайдено
бормат

5

Я взяв відповідь Петра Варги, щоб додати, declare var require: any;і перетворив її на загальне рішення, яке працює для всіх файлів .ts загалом, використовуючи попередньо завантажувач :

  1. встановити препроцесор-завантажувач:

    npm install preprocessor-loader
  2. додайте завантажувач до свого webpack.config.js (я використовую ts-loader для обробки джерел 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; })"
    }]
}

Ви можете додати більш надійний Requ.d.ts так само, але declare var require: any;в моїй ситуації було достатньо

Зауважте, в препроцесорі 1.0.5 є помилка , яка відсікає останній рядок, тому просто переконайтеся, що у вас є повернення додаткового простору в кінці, і ви будете добре.


1
Чому це було знято? Він відповідає на запитання і приносить щось нове і значне для столу. Тепер вам не доведеться обробляти кожен файл окремо, щоб задовольнити трансілер і веб-пакет.
Бенні Боттема

Чи можете ви пояснити крок 3? Я новачок і не знаю, куди подіти цей конфігураційний код.
користувач441058

@ user441058, перегляньте сторінку GitHub , крок 3 - про основну конфігурацію попередньо завантажувача.
Бенні Боттема

2

Я також боровся з цим питанням. Я вважаю, що це працює для всіх кандидатів у випуск aka aka rc, але я не тестував. Для @angular rc.2 він добре працює.

  1. Додати core-jsяк npm залежність уpackage.json
  2. бігати typings install core-js --save
  3. видаліть усі "es6-shim"випадки у вашому package.json. Вам це вже не потрібно.

Ура!


для чого потрібна типізація core-js? характерний для вузла?
dcsan



2

Іноді відсутній "жасмин" від 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 для всіх, хто хоче знати.
Стівен Зенг

1
це для кутового 9.
Арунь

1
  1. Ви вказали, який модуль використовувати для трансляції коду?
    tsc --target es5 --module commonjs script.ts
    Ви повинні зробити це, щоб повідомити транспілятору, що ви компілюєте код NodeJS. Docs .

  2. Ви також повинні встановити визначення мангустів
    tsd install mongoose --save

  3. Не використовуйте varдля декларування змінних (якщо це не потрібно, що є дуже рідкісним випадком), використовуйте letнатомість. Дізнайтеся більше про це


1

Просто на додаток до відповіді cgatian для TypeScript 1.x

Якщо ви все ще бачите помилки, будь ласка, вкажіть спеціально index.d.ts у параметрах компілятора.

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

1

Я не міг отримати помилку "вимагати", щоб усунутись, використовуючи будь-який із наведених вище прийомів.

Але я дізнався, що проблема полягала в тому, що мої інструменти TypeScript для Visual Studio, де стара версія (1.8.6.0) та остання версія на сьогоднішній день (2.0.6.0).

Ви можете завантажити останню версію інструментів з:

TypeScript для Visual Studio 2015


1

Якщо ви можете скласти код, але позначки Visual Studio 2015 "вимагають" функцій, оскільки помилки з текстом помилки не можуть знайти ім'я "вимагати" або не можуть вирішити символ "вимагати" , оновіть TypeScript для Visual Studio 2015 до останньої версії (на даний момент 2.1. 5) та оновіть ReSharper (якщо ви його використовуєте) до принаймні версії 2016.3.2.

У мене ця проблема була набридлива деякий час, і я не міг знайти рішення, але я нарешті вирішив її таким чином.



1

Я ще одна відповідь , який спирається на всі попередні , які описують npm install @types/nodeі в тому числі nodeв tsconfig.json / compilerOptions / types.

У моєму випадку я маю базову tsConfig.jsonта окрему в програмі Angular, яка розширює цю:

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

Моя проблема була порожньою typesв цьому tsconfi.app.json- вона клобує ту, що знаходиться в базовій конфігурації.


-2

Якщо ви зіткнулися з цією проблемою у файлі .ts, який є лише там, щоб надати вам постійні значення, тоді ви можете просто

перейменуйте свій .ts файл у .js файл

і помилка не з’явиться знову.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.