TypeScript obtenant l'erreur TS2304: impossible de trouver le nom «requis»

463

J'essaie de faire fonctionner ma première application TypeScript et DefinitelyTyped Node.js, et je rencontre certaines erreurs.

J'obtiens l'erreur "TS2304: Impossible de trouver le nom 'require'" lorsque j'essaie de transpiler une simple page TypeScript Node.js. J'ai lu plusieurs autres occurrences de cette erreur sur Stack Overflow et je ne pense pas avoir des problèmes similaires. Je lance à l'invite du shell la 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 lancée sur la var mongoose=require('mongoose')ligne.

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

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

Les références du fichier .d.ts ont été placées dans les dossiers appropriés et ajoutées à typings / tsd.d.ts par les commandes:

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

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

JerryKur
la source
1
when I attempt to transpile a simple ts node page<comment transpilez-vous ... quel utilitaire
basarat
1
Je suis juste en cours d'exécution sur la ligne de commande en tapant la commande: tsc movie.server.model.ts. FWIW c'est sur un Mac.
JerryKur
1
Le même problème s'est également produit dans l'IDE que j'utilisais Visual Studio Code. Je vais l'essayer avec mon autre IDE, IntelliJ. J'ai supposé que le passage à la ligne de commande était le moyen le plus propre de tester ce problème.
JerryKur
Et alors import { mongoose } from 'mongoose'?
FisNaN

Réponses:

744

Rapide et sale

Si vous n'avez qu'un seul fichier à l'aide de require, ou si vous le faites à 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, vous n'avez plus besoin d'installer Typings ou Definitely Typed. Installez simplement le package suivant.

npm install @types/node --save-dev

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

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

Vérifiez ou modifiez votre src /tsconfig.app.json afin qu'il contienne les éléments suivants:

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

Assurez-vous que le fichier se trouve dans le dossier src et non dans le dossier racine de l'application.

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

TypeScript 1.x

À l'aide de typages (remplacement de DefinitelyTyped), vous pouvez spécifier une définition directement à partir d'un référentiel GitHub.

Installer les saisies

npm install typings -g --save-dev

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

typings install dt~node --save --global

Webpack

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

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

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

"types": [
      "webpack-env"
    ]

Cela vous permet de faire require.ensureet 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.

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

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
cgatian
la source
4
pourquoi pas seulement "taper install --save --ambient require"?
kutomer
1
j'obtiens une erreur avec ceci Unable to find "require" ("npm") in the registry. Est-il nécessaire de faire partie d'un ensemble plus large de typages nodeJS?
dcsan
7
Je pense que cela est faux car il est lié aux typages pour requireJS, pas au nœud intégré require. peut-être sa bonne réponse pour une certaine variation de la cible de sortie ES5 mais pas le cas général.
dcsan
1
Veuillez vous référer à Jordan Awnser. Dans mon cas, j'avais installé les @types suivants, j'ai donc ajouté -> "types": ["node", "es6-promise", "core-js", "jasmine"] <- à compilerOptions dans tsconfig.json
Lothre1
1
@Seagull @types/nodesont les définitions TypeScript. Node ne les inclut pas et ne devrait pas les inclure.
cgatian
103

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

  1. Installez un package 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 dans le monde entier telles que require. Pour la plupart des packages, vous devez simplement utiliser le import package from 'package'modèle. Il n'est pas nécessaire d'inclure tous les packages dans le tableau de types tsconfig.json ci-dessus.

Jordan
la source
1
Vous pouvez soit utiliser lib pour certains es5 github.com/Microsoft/TypeScript/wiki/… Eq: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro
Après avoir ajouté "types": ["jasmine", "hammerjs"]à tsconfig.jsje dois ajouter nodeaussi. Merci Jordan.
Mikeumus
Lorsque je suis ce conseil, il casse toutes mes importations. Par exemple, import express from "express";me dit maintenant que je dois essayer d'installer @ types / express ou ajouter un fichier .d.ts pour cela.
austinthemassive
4
Si vous avez plus @types/...qu'un simple @types/nodedossier ne pas ajouter "types": ["node"]à tsconfig.jsoncause tapuscrit compiller omettra d' autres paquets non mentionnés. Cela cassera la résolution de vos types d'IDE. Il est écrit ici typescriptlang.org/docs/handbook/…
Marecky
Cette solution fonctionne pour moi dans un projet ionique sans problème, merci :)
Fran Sandi
71

Vous pouvez

declare var require: any

Ou, pour une prise en charge plus complète, utilisez le fichier require.d.ts de DefinitelyTyped

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

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
ᆼ ᆺ ᆼ
la source
1
À propos de l'utilisation use strictdans TypeScript: réponse basarat et «Use Strict» nécessaires dans un fichier TypeScript?. Il est nécessaire d'utiliser use stricten TypeScript.
Eugene Bichel
Hm, selon cette réponse, ce n'est pas nécessaire mais pourrait être bénéfique à utiliser "use strict", je vais modifier ma réponse
ᆼ ᆺ ᆼ
utiliser declare var require ne résout pas le vrai problème; juste le cacher.
My Stack Overfloweth
@Ant bien, gardez à l'esprit que cela date de 2015, et aussi, je dirais qu'il n'y a pas de "problème" à résoudre. Bien entendu, TypeScript 2.0 résout ce problème avec élégance
ᆼ ᆺ ᆼ
12

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

Tu ne besoin d'installer @ types / node (qui est tous les types Node.js et n'est pas pertinent pour le code frontal, compliquant en fait des choses telles que setTimout différentes valeurs de retour, etc.)

Vous avez besoin d'installer @ types / webpack-env

npm i -D @types/webpack-env

qui donne les signatures d'exécution de Webpack (y compris require,require.ensure etc.)

Assurez-vous également que votre fichier tsconfig.json n'a pas de tableau de «types» défini -> ce qui lui permettra de récupérer toutes les définitions de type dans votre dossier node_modules / @ types.

Si vous souhaitez restreindre la recherche de types, vous pouvez définir la propriété typeRoot sur node_modules / @ types.

Nadav SInai
la source
1
c'est une remarque importante, assurez-vous également que votre tsconfig.json n'a pas de tableau 'types' défini -> ce qui lui permettra de récupérer toutes les définitions de types dans votre dossier node_modules / @ types
Marecky
Y a-t-il d'autres étapes nécessaires avec l'approche webpack? J'obtiens une erreur de compilation «erreur TS2580: impossible de trouver le nom« require ».»
jaycer
10

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.

ouragan
la source
Fonctionne, mais un peu sale IMO - il cache essentiellement l'erreur au lieu de la corriger. Parfait pour les démos et les scripts rapides, mais pas pour la production
Nino Filiu
8

Dans mon cas, c'était un problème super stupide, où le src/tsconfig.app.jsondépassement dutsconfig.json paramètre.

Donc, j'ai eu ça dans tsconfig.json:

    "types": [
      "node"
    ]

Et celui-ci dans src/tsconfig.app.json:

    "types": []

J'espère que quelqu'un trouve cela utile, car cette erreur me faisait des cheveux gris.

h22a
la source
8

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

    "types": ["node"], // within compilerOptions
Hearen
la source
fait ça. Vous avez toujours cette erreur: Impossible de trouver le nom «requis». Avez-vous besoin d'installer des définitions de type pour le nœud? Essayez npm i @types/nodepuis ajoutez nodeau champ types dans votre tsconfig. - npm s'est-il installé.
Suisse
7

J'ai trouvé que la solution était d'utiliser la commande TSD:

tsd install node --save

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

En haut de mon dossier, je mets une référence à tsd.d.tsceci:

/// <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[];
}
AlexStack
la source
J'ai 404 introuvable
bormat
5

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

  1. installer le 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 require.d.ts le plus robuste de la même manière, maisdeclare var require: any; c'était suffisant dans ma situation.

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

Benny Bottema
la source
1
Pourquoi cela a-t-il été rejeté? Il répond à la question et apporte quelque chose de nouveau et de significatif à la table. Maintenant, vous n'avez plus à manipuler chaque fichier individuellement pour satisfaire le transpilateur et le webpack.
Benny Bottema
Pouvez-vous expliquer l'étape 3 de plus? Je suis un newb et je ne sais pas où mettre ce code de configuration.
user441058
@ user441058, consultez la page GitHub , l'étape 3 concerne la configuration principale du pré-processus-chargeur.
Benny Bottema
2

J'ai également eu du mal à résoudre ce problème. Je crois que cela fonctionne pour tous les candidats à la version aka rc mais je n'ai pas testé. Pour @angular rc.2, cela fonctionne bien.

  1. Ajouter en core-jstant que dépendance npm danspackage.json
  2. courir typings install core-js --save
  3. supprimer toutes les "es6-shim"occurrences de votre package.json. Vous n'en avez plus besoin.

À votre santé!

kucherenkovova
la source
à quoi servent les typages core-js? spécifique au nœud?
dcsan
2

Assurez-vous que vous avez installé npm i @types/node

Rupesh Kumar Tiwari
la source
2

importer * comme mangouste de 'mangouste'

basquith16
la source
2

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

Alors ajoutez

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

à votre tsconfig.jsondossier.

Samintha Kaveesh
la source
2

Addition Electron + Angular 2/4:

En plus d'ajouter le type 'node' à divers fichiers ts.config, ce qui a finalement fonctionné pour moi a été d'ajouter le suivant au typings.d.tsfichier:

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

Notez que mon boîtier se développe avec Electron + Angular 2/4. J'avais besoin de l'exigence sur la fenêtre globale.

mihaa123
la source
2

Pour moi, il est résolu en ajoutant des types aux options du compilateur angulaire.

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Farida Anjum
la source
C'est dans tsconfig.json pour quiconque veut savoir.
Stephen Zeng
1
c'est pour angulaire 9.
Arun
1
  1. Avez-vous spécifié quel module utiliser pour transpiler le code?
    tsc --target es5 --module commonjs script.ts
    Vous devez le faire pour que le transpilateur sache que vous compilez du code NodeJS. Docs .

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

  3. Ne pas utiliser varpour déclarer des variables (sauf si nécessaire, ce qui est un cas très rare), utilisez letplutôt. En savoir plus

Ayman Nedjmeddine
la source
1

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

Si vous voyez toujours des erreurs, veuillez fournir spécifiquement index.d.ts dans vos options de compilation.

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

Je n'ai pas pu obtenir l'erreur «exiger» pour disparaître 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 contenaient une ancienne version (1.8.6.0) et la dernière version à ce jour (2.0.6.0).

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

TypeScript pour Visual Studio 2015

Thomas
la source
1

Si vous pouvez compiler du code, mais que Visual Studio 2015 marque les fonctions 'require' car les erreurs avec le texte d'erreur ne peuvent pas trouver le nom 'require' ou ne peuvent pas résoudre le symbole 'require' , mettez à jour TypeScript for Visual Studio 2015 vers la dernière version (actuellement 2.1). 5) et mettez à jour ReSharper (si vous l'utilisez) vers au moins la version 2016.3.2.

J'ai eu ce problème ennuyeux pendant un certain temps et je n'ai pas pu trouver de solution, mais je l'ai finalement résolu de cette façon.

Mike Eshva
la source
1

Ajoutez ce qui suit dans tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]
Darshan Ballal
la source
2
Ceci est déjà mentionné dans la réponse de @ cgatian .
tuomastik
@cgatian a mentionné "node_modules / @ types" tandis que j'ai mentionné "../node_modules/@types".
Darshan Ballal
1

Je n'ai pas encore une autre réponse qui prend appui sur toutes les précédentes qui décrivent npm install @types/nodeet y compris nodedans tsconfig.json / compilerOptions / types.

Dans mon cas, j'ai une base tsConfig.jsonet une autre dans l'application Angular qui étend celle-ci:

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

Mon problème était le vide typesdans cela tsconfi.app.json- il encombre celui de la configuration de base.

HankCa
la source
-2

Si vous rencontrez ce problème dans un fichier .ts qui n'est là que pour vous fournir des valeurs constantes, vous pouvez simplement

renommer votre fichier .ts en fichier .js

et l'erreur ne se reproduira pas.

Aavgeen singh
la source