web-dev-qa-db-fra.com

erreur d’écriture typographique TS2304: impossible de trouver le nom 'require'

J'essaie de lancer et d'utiliser mon premier nœud App TypScript et DefinitelyTyped, et de rencontrer des erreurs.

Je reçois le message d'erreur "TS2304: Impossible de trouver le nom 'require'" lorsque j'essaie de transpiler une page de noeud ts simple. J'ai lu plusieurs autres occurrences de cette erreur sur SO et je ne pense pas avoir de problèmes similaires.
J'exécute sur le shell l'invite de commande: tsc movie.server.model.ts. Le contenu de ce fichier est:

'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'erreur est renvoyée sur la ligne var mongoose = require ('mongoose')

Le contenu du fichier typings/tsd.d.ts est:

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

Les références de fichier .d.ts ont été placées dans les dossiers appropriés et ajoutées à typings/tsd.d.ts à l’aide des commandes suivantes:

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

Le fichier .js produit semble bien fonctionner, je peux donc ignorer l'erreur. Mais j'apprécierais de savoir pourquoi cette erreur se produit et ce que je fais mal.

335
JerryKur

Rapide et sale

Si vous n'avez qu'un seul fichier à utiliser, ou si vous faites cela à des fins de démonstration, vous pouvez définir require en haut de votre fichier TypeScript.

declare var require: any

TypeScript 2.x

Si vous utilisez TypeScript 2.x, il n'est plus nécessaire que Typings ou Definitely Typed soit installé. Installez simplement le paquet suivant.

npm install @types/node --save-dev

L'avenir des fichiers de déclarations (15/06/2016)

Des outils comme Typings et tsd continueront à fonctionner, et nous le ferons aux côtés de ces communautés pour assurer une transition en douceur.

FACULTATIF: Si vous spécifiez typeroots ou types dans votre tsconfig.json. Vous devrez peut-être mettre à jour le tsconfig.json pour inclure le noeud en tant que type. Par défaut, tout package sous @types est déjà inclus dans votre build sauf si vous avez spécifié l'une de ces options. Lire la suite

Vous trouverez ci-dessous la configuration appropriée pour chacune de ces options.

{
    "compilerOptions": {
        // types option has been previously configured
         "types": [
            // add node as an option
            "node"
         ],
         // typeRoots option has been previously configured
         "typeRoots": [
            // add path to @types
            "node_modules/@types"
         ]
    }
}

TypeScript 1.x

En utilisant des typings (remplacement de DefinitelyTyped), vous pouvez spécifier une définition directement à partir d'un référentiel GitHub.

Installer des typages

npm install typings -g --save-dev

Installer la définition de type requireJS à partir du référentiel de DefinitelyType

typings install dt~node --save --global

Webpack

Si vous utilisez Webpack comme outil de génération, vous pouvez inclure les types Webpack.

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

Mettez à jour votre tsconfig.json avec les éléments suivants sous compilerOptions:

"types": [
      "webpack-env"
    ]

Cela vous permet d'effectuer require.ensure et d'autres fonctions spécifiques à Webpack.

CLI angulaire

Avec CLI, vous pouvez suivre l’étape Webpack ci-dessus et ajouter le bloc "types" à votre tsconfig.app.json.

Vous pouvez également utiliser les types node préinstallés. Gardez à l'esprit que cela inclura des types supplémentaires dans votre code côté client qui ne sont pas vraiment disponibles. 

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

Pour TypeScript 2.x , il y a maintenant deux étapes:

  1. Installez un paquet qui définit require. Par exemple:

    npm install @types/node --save-dev
    
  2. Dites à TypeScript de l'inclure globalement dans tsconfig.json:

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

La deuxième étape n’est importante que si vous avez besoin d’accéder à des fonctions disponibles globalement, telles que require. Pour la plupart des paquets, vous devriez simplement utiliser le modèle import package from 'package'. Il n'est pas nécessaire d'inclure tous les packages dans le tableau de types tsconfig.json ci-dessus.

76
Jordan

Vous pouvez

declare var require: any

Ou, pour un support plus complet, utilisez DefinitelyTyped's require.d.ts

De plus, au lieu de var mongoose = require('mongoose'), vous pouvez essayer ce qui suit 

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

Au lieu de:

'use strict';

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

Essayer: 

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

'use strict';

c'est-à-dire le chemin de référence en premier.

9
Hurricane

J'ai trouvé que la solution consistait à utiliser la commande TSD:

tsd install node --save

Ce qui ajoute/met à jour le fichier typings/tsd.d.ts et ce fichier contient toutes les définitions de type requises pour une application de noeud.

En haut de mon fichier, je mets une référence au tsd.d.ts comme ceci:

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

Le besoin est défini comme ceci à partir de janvier 2016:

declare var require: NodeRequire;

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

Cette réponse concerne les configurations modernes (TypeScript 2.x, webpack> 2.x)

vous n'avez PAS besoin d'installer @ types/node (ce qui correspond à tous les types de node.js et n'a aucune importance pour le code frontal, ce qui complique les choses telles que setTimout avec une valeur de retour différente, etc.

vous devez installer @ types/webpack-env

npm i -D @types/webpack-env

qui donne les signatures d’exécution du webpack (notamment require et require.ensure etc.)

assurez-vous également que votre tsconfig.json n'a pas défini de tableau 'types' -> ce qui lui permettra de récupérer toutes les définitions de types dans votre dossier node_modules/@ types . si vous souhaitez restreindre la recherche de types, vous pouvez définir la propriété typeRoot. vers node_modules/@ types 

6
Nadav SInai

J'ai pris la réponse de Peter Varga pour ajouter declare var require: any; et en ai fait une solution générique qui fonctionne de manière générique pour tous les fichiers .ts en utilisant le preprocess-loader :

  1. installer pré-processeur-chargeur:

    npm install preprocessor-loader
    
  2. ajoutez le chargeur à votre webpack.config.js (j'utilise ts-loader pour le traitement des sources TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Ajoutez la configuration qui ajoutera la solution de contournement à chaque source:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Vous pouvez ajouter le plus robuste require.d.ts de la même manière, mais declare var require: any; était suffisant dans mon cas.

Remarque: il y a un bogue dans le préprocesseur 1.0.5 , qui coupe la dernière ligne, assurez-vous simplement que vous avez un retour d’espace supplémentaire à la fin et tout ira bien.

4
Benny Bottema

Assurez-vous d'avoir installé npm i @types/node

2
Rupesh Kumar Tiwari

importer * en tant que mangouste à partir de 'mangouste'

1
basquith16

Je me bats aussi de ce problème. Je crois que cela fonctionne pour tous les candidats release aka rc mais je n'ai pas testé si. Pour @angular rc.2 cela fonctionne bien.

  1. Ajoutez core-js comme dépendance npm dans package.json
  2. exécuter typings install core-js --save
  3. supprimez toutes les occurrences de "es6-shim" dans votre package.json. Vous n'en avez plus besoin.

À votre santé!

1
kucherenkovova

Parfois manquant "jasmine" de tsconfig.json peut provoquer cette erreur (TypeScript 2.X)

alors ajoutez

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

à votre tsconfig.json

1
Samintha Kaveesh

Electron + addition 2/4 angulaire: En plus de l'ajout du type 'node' à ts.config de divers fichiers, ce qui a finalement fonctionné pour moi est d'ajouter le fichier suivant au fichier

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

Notez que mon cas se développe avec électron + angulaire 2/4. J'avais besoin de l'exigence sur la fenêtre globale.

1
mihaa123

Ajouter ce qui suit dans tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]
0
Darshan Ballal

Juste pour référence, j'utilise Angular 7.1.4 , TypeScript 3.1.6 et la seule chose à faire est d'ajouter cette ligne dans tsconfig.json

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

J'espère que ça peut aider. 

0
Hearen

Juste en plus de la réponse de cgatian, pour TypeScript 1.x

Si vous constatez toujours des erreurs, veuillez indiquer spécifiquement index.d.ts dans les options du compilateur.

"files": [
    "typings/index.d.ts"
]
0
Vidish Datta
  1. Avez-vous spécifié quel module utiliser pour transpiler le code?
    tsc --target es5 --module commonjs script.ts
    Vous devez faire cela pour que le transpiler sache que vous compilez du code NodeJS. Docs .

  2. Vous devez également installer les définitions de mangouste
    tsd install mongoose --save

  3. N'utilisez pas var pour déclarer des variables (sauf si nécessaire, ce qui est un cas très rare), utilisez plutôt letEn savoir plus à ce sujet

0
Ayman Nedjmeddine

J'ai encore une autre réponse qui s'appuie sur toutes les réponses précédentes décrivant npm install @types/node et incluant node dans tsconfig.json / compilerOptions / types.

Dans mon cas, j'ai un tsConfig.json de base et un séparé dans l'application Angular qui étend celui-ci:

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

Mon problème était la types vide dans ce tsconfi.app.json - elle obstrue celle de la configuration de base.

0
HankCa

Si vous pouvez compiler du code mais que Visual Studio 2015 marque "nécessite" des fonctions en tant qu'erreurs avec le texte d'erreur ne trouve pas le nom "requiert" ou ne peut pas résoudre le symbole "nécessite" met à jour TypeScript pour Visual Studio 2015 vers la dernière version (pour le moment, version 2.1.5) et mettez à jour ReSharper (si vous l’utilisez) vers la version 2016.3.2 au moins.

J'ai eu ce problème ennuyeux pendant un moment, je ne pouvais pas trouver de solution, mais je l'ai finalement résolu de cette façon. J'espère que cela aide quelqu'un.

0
Mike Eshva

Je ne pouvais pas obtenir l'erreur de 'nécessité' de partir en utilisant l'une des astuces ci-dessus.

mais j'ai découvert que le problème était que mes outils TypeScript pour Visual Studio étaient une ancienne version (1.8.6.0) et la dernière version mise à jour (2.0.6.0).

Vous pouvez télécharger la dernière version des outils à partir de:

https://www.Microsoft.com/en-us/download/details.aspx?id=48593

0
Thomas