Errore di scrittura in TypeScript TS2304: impossibile trovare il nome 'richiede'


463

Sto cercando di mettere in funzione la mia prima applicazione TypeScript e DefinitelyTyped Node.js e riscontrare alcuni errori.

Ricevo l'errore "TS2304: Impossibile trovare il nome 'richiede'" quando tento di compilare una semplice pagina Node.js TypeScript. Ho letto diverse altre occorrenze di questo errore su StackTranslate.it e non penso di avere problemi simili. Sono in esecuzione al prompt della shell il comando:

tsc movie.server.model.ts.

I contenuti di questo file sono:

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

L'errore viene lanciato sulla var mongoose=require('mongoose')linea.

I contenuti del file typings / tsd.d.ts sono:

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

I riferimenti ai file .d.ts sono stati collocati nelle cartelle appropriate e aggiunti a typings / tsd.d.ts dai comandi:

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

Il file .js prodotto sembra funzionare correttamente, quindi potrei ignorare l'errore. Ma apprezzerei sapere perché si verifica questo errore e cosa sto facendo di sbagliato.


1
when I attempt to transpile a simple ts node page<come stai traspilando ... quale utilità
basarat

1
Sto correndo sulla riga di comando digitando il comando: tsc movie.server.model.ts. FWIW questo è su un Mac.
JerryKur,

1
Lo stesso problema si è verificato anche nell'IDE che utilizzavo Visual Studio Code. Proverò l'altro mio IDE, IntelliJ. Supponevo che passare alla riga di comando fosse il modo più pulito per testare questo problema.
JerryKur,


Che ne dici import { mongoose } from 'mongoose'?
FisNaN,

Risposte:


744

Veloce e sporco

Se hai solo un file che utilizza request, o lo stai facendo per scopi dimostrativi, puoi definire request nella parte superiore del tuo file TypeScript.

declare var require: any

TypeScript 2.x

Se si utilizza TypeScript 2.x non è più necessario installare Typings o Definitely Typed. Installa semplicemente il seguente pacchetto.

npm install @types/node --save-dev

Il futuro dei file delle dichiarazioni (15/06/2016)

Strumenti come Typings e tsd continueranno a funzionare e lavoreremo insieme a quelle community per garantire una transizione senza intoppi.

Verifica o modifica il tuo src /tsconfig.app.json in modo che contenga quanto segue:

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

Assicurarsi che sia il file nella cartella src e non quello nella cartella dell'app root.

Per impostazione predefinita, qualsiasi pacchetto in @types è già incluso nella tua build a meno che tu non abbia specificato una di queste opzioni. Leggi di più

TypeScript 1.x

Utilizzando le tipizzazioni (la sostituzione di DefinitelyTyped) è possibile specificare una definizione direttamente da un repository GitHub.

Installa digitazioni

npm install typings -g --save-dev

Installa la definizione del tipo requestJS dal repository di DefinitelyType

typings install dt~node --save --global

Webpack

Se si utilizza Webpack come strumento di creazione, è possibile includere i tipi di Webpack.

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

Aggiorna il tuo tsconfig.jsoncon quanto segue compilerOptions:

"types": [
      "webpack-env"
    ]

Questo ti permette di fare require.ensuree altre funzioni specifiche di Webpack.

CLI angolare

Con CLI puoi seguire il passaggio Webpack sopra e aggiungere il blocco "types" al tuo tsconfig.app.json.

In alternativa, è possibile utilizzare i nodetipi preinstallati . Tieni presente che questo includerà altri tipi di codice lato client che non sono realmente disponibili.

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

4
perché non solo "digitazioni install --save --ambient richiedono"?
Kutomer,

1
ottengo un errore con questo Unable to find "require" ("npm") in the registry. Richiede parte di un set più ampio di tipizzazioni nodeJS?
dcsan,

7
penso che questo sia SBAGLIATO in quanto relativo alle tipizzazioni per requestJS, non al nodo incorporato require. forse la risposta giusta per alcune variazioni del target di output ES5 ma non nel caso generale.
dcsan,

1
Si prega di fare riferimento a Jordan Awnser. Nel mio caso avevo installato i seguenti @tipi, quindi ho aggiunto -> "tipi": ["nodo", "es6-promise", "core-js", "jasmine"] <- a compilatoreOpzioni in tsconfig.json
Lothre1

1
@Seagull @types/nodesono le definizioni di TypeScript. Il nodo non include questi, né dovrebbero.
cgatian

103

Per TypeScript 2.x , ora ci sono due passaggi:

  1. Installa un pacchetto che definisce require. Per esempio:

    npm install @types/node --save-dev
  2. Di 'a TypeScript di includerlo globalmente in tsconfig.json:

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

Il secondo passaggio è importante solo se è necessario accedere a funzioni disponibili a livello globale come require. Per la maggior parte dei pacchetti, dovresti semplicemente usare il import package from 'package'modello. Non è necessario includere tutti i pacchetti nella matrice di tipi tsconfig.json sopra.


1
Puoi usare lib per alcuni es5 github.com/Microsoft/TypeScript/wiki/… Eq: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro

Dopo aver aggiunto "types": ["jasmine", "hammerjs"]a tsconfig.jsIde ha aggiunto nodeanche. Grazie Giordania.
Mikeumus,

Quando seguo questo consiglio, interrompe tutte le mie importazioni. Ad esempio, import express from "express";ora mi sta dicendo che devo provare a installare @ types / express o aggiungere un file .d.ts per questo.
austinthemassive,

4
Se si dispone di più @types/...di una semplice @types/nodecartella non aggiungere "types": ["node"]a tsconfig.jsonquanto dattiloscritto compiller ometterà altri pacchetti non menzionati. Ciò interromperà la risoluzione dei tipi di IDE. È scritto qui typescriptlang.org/docs/handbook/…
Marecky

Questa soluzione funziona per me in un progetto ionico senza problemi, grazie :)
Fran Sandi,

71

Puoi

declare var require: any

In alternativa, per un supporto più completo, utilizzare il file request.d.ts di DefinitelyTyped

Inoltre, invece di var mongoose = require('mongoose'), potresti provare quanto segue

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

1
Quasi sull'uso use strictin TypeScript: basarat answer e "Use Strict" necessari in un file TypeScript? . È necessario utilizzare use strictin TypeScript.
Eugene Bichel,

Hm, secondo quella risposta non è necessario ma potrebbe essere utile da usare "use strict", modificherò la mia risposta
ᆼ ᆺ ᆼ

l'uso di dichiarare var request non risolve il problema reale; nascondendolo.
mia pila trabocca il

@Ant giusto, tieni presente che è del 2015 e inoltre, direi che non c'è nessun "problema" da risolvere. TypeScript 2.0 ora risolve questo problema in modo elegante
ᆺ ᆼ

12

Questa risposta si riferisce alle configurazioni moderne (TypeScript 2.x, Webpack > 2.x)

Non è necessario installare @ types / node (che è di tutti i tipi Node.js ed è irrilevante per il codice front-end, complicando effettivamente cose come setTimout diversi valori di ritorno, ecc.

Si fa necessità di installare @ tipi / webpack-ENV

npm i -D @types/webpack-env

che dà le firme di runtime che ha Webpack (tra cui require, require.ensure, etc.)

Assicurati anche che il tuo file tsconfig.json non abbia un array 'types' impostato -> che lo farà prelevare tutte le definizioni dei tipi nella cartella node_modules / @ types.

Se si desidera limitare la ricerca dei tipi, è possibile impostare la proprietà typeRoot su node_modules / @ types.


1
questa è un'osservazione importante, inoltre, assicurati che il tuo tsconfig.json non abbia un set di array 'types' -> che lo farà ritirare tutte le definizioni dei tipi nella cartella node_modules / @ types
Marecky

Ci sono altri passaggi necessari con l'approccio webpack? Ricevo un errore di compilazione `errore TS2580: impossibile trovare il nome 'richiede'.
jaycer

10

Invece di:

'use strict';

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

Provare:

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

'use strict';

cioè prima il percorso di riferimento.


Funziona, ma in qualche modo sporco IMO - nasconde sostanzialmente l'errore invece di correggerlo. Perfetto per demo e script veloci, ma non per la produzione
Nino Filiu,

8

Nel mio caso, si è trattato di un problema super stupido, in cui src/tsconfig.app.jsonl' tsconfig.jsonambientazione era prioritaria .

Quindi, ho avuto questo in tsconfig.json:

    "types": [
      "node"
    ]

E questo in src/tsconfig.app.json:

    "types": []

Spero che qualcuno lo trovi utile, poiché questo errore mi stava causando i capelli grigi.


8

Solo per riferimento, sto usando angolare 7.1.4 , dattiloscritto 3.1.6 , e l'unica cosa che devo fare è quello di aggiungere questa linea in tsconfig.json:

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

fatto quello. Ho ancora ricevuto questo errore: Impossibile trovare il nome 'richiedi'. Devi installare le definizioni dei tipi per il nodo? Prova npm i @types/nodee poi aggiungi nodeal campo tipi nel tuo tsconfig. - ha installato npm.
Suisse,

7

Ho scoperto che la soluzione era usare il comando TSD:

tsd install node --save

Che aggiunge / aggiorna il typings/tsd.d.tsfile e quel file contiene tutte le definizioni dei tipi richieste per un'applicazione nodo.

Nella parte superiore del mio file, ho inserito un riferimento al seguente tsd.d.ts:

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

Il requisito è definito come questo a partire da gennaio 2016:

declare var require: NodeRequire;

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

Non ho trovato 404
bormat

5

Ho preso la risposta di Peter Varga per aggiungerla declare var require: any;e trasformarla in una soluzione generica che funziona genericamente per tutti i file .ts usando il preprocess-loader :

  1. installa il preprocessore-caricatore:

    npm install preprocessor-loader
  2. aggiungi il caricatore al tuo webpack.config.js (sto usando ts-loader per l'elaborazione delle fonti TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Aggiungi la configurazione che aggiungerà la soluzione alternativa a ogni sorgente:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

È possibile aggiungere il più robusto requisito.d.ts allo stesso modo, ma declare var require: any;era sufficiente nella mia situazione.

Nota, c'è un bug nel preprocessore 1.0.5 , che interrompe l'ultima riga, quindi assicurati di avere un ritorno di spazio extra alla fine e andrà bene.


1
Perché questo è stato downvoted? Risponde alla domanda e porta sul tavolo qualcosa di nuovo e significativo. Ora non devi manipolare ogni singolo file per soddisfare il transpiler e il webpack.
Benny Bottema,

Puoi spiegare il passaggio 3 di più? Sono un principiante e non so dove inserire questo codice di configurazione.
user441058

@ user441058, controlla la pagina GitHub , il passaggio 3 riguarda la configurazione principale per il preprocess-loader.
Benny Bottema,

2

Ho lottato anche per questo problema. Credo che questo funzioni per tutti i candidati al rilascio noti anche come rc, ma non ho testato è però. Per @angular rc.2 funziona bene.

  1. Aggiungi core-jscome dipendenza npm inpackage.json
  2. correre typings install core-js --save
  3. rimuovere tutte le "es6-shim"occorrenze nel tuo package.json. Non ne hai più bisogno.

Saluti!


a cosa servono le tipizzazioni core-js? specifico per nodo?
dcsan,



2

A volte manca "jasmine" da tsconfig.json può causare questo errore. (TypeScript 2.X)

Quindi aggiungi

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

al tuo tsconfig.jsonfile.


2

Aggiunta di Electron + Angular 2/4:

Oltre ad aggiungere il tipo 'node' a vari file ts.config, quello che alla fine ha funzionato per me è stato l'aggiunta del prossimo al typings.d.tsfile:

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

Nota che il mio caso si sta sviluppando con Electron + Angular 2/4. Avevo bisogno del requisito sulla finestra globale.


2

Per me è stato risolto aggiungendo tipi alle opzioni del compilatore angolare.

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

È in tsconfig.json per chiunque voglia saperlo.
Stephen Zeng

1
questo è per angolare 9.
Arun

1
  1. Hai specificato quale modulo utilizzare per traspilare il codice?
    tsc --target es5 --module commonjs script.ts
    Devi farlo per far sapere al transpiler che stai compilando il codice NodeJS. Doc .

  2. È inoltre necessario installare le definizioni di mangusta
    tsd install mongoose --save

  3. Non utilizzare varper dichiarare le variabili (a meno che non sia necessario, il che è un caso molto raro), utilizzare letinvece. Ulteriori informazioni al riguardo


1

Solo in aggiunta alla risposta di cgatian, per TypeScript 1.x

Se riscontri ancora errori, specifica in modo specifico index.d.ts nelle opzioni del tuo compilatore.

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

1

Non è stato possibile ottenere l'errore "Richiedi" per andare via utilizzando uno dei trucchi sopra.

Ma ho scoperto che il problema era che i miei strumenti TypeScript per Visual Studio dove una vecchia versione (1.8.6.0) e l'ultima versione di oggi è (2.0.6.0).

Puoi scaricare l'ultima versione degli strumenti da:

TypeScript per Visual Studio 2015


1

Se è possibile compilare il codice, ma i segni di Visual Studio 2015 'richiedono' poiché gli errori con testo di errore non riescono a trovare il nome 'richiedono' o non riescono a risolvere il simbolo 'richiedono' , aggiornare TypeScript per Visual Studio 2015 all'ultima versione (al momento 2.1. 5) e aggiorna ReSharper (se lo usi) almeno alla versione 2016.3.2.

Ho avuto questo fastidioso problema per un po 'e non sono riuscito a trovare una soluzione, ma alla fine l'ho risolto in questo modo.



1

Ho ancora un'altra risposta che si basa su tutti i precedenti che descrivono npm install @types/nodee compreso nodein tsconfig.json / compilerOptions / types.

Nel mio caso, ho una base tsConfig.jsone una separata nell'applicazione Angolare che estende questa:

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

Il mio problema era il vuoto typesin questo tsconfi.app.json- blocca quello nella configurazione di base.


-2

Se stai affrontando questo problema in un file .ts che è lì solo per fornirti alcuni valori costanti, allora puoi semplicemente

rinominare il file .ts in file .js

e l'errore non verrà più.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.