TypeScript obtiene error TS2304: no se puede encontrar el nombre 'require'

463

Estoy tratando de poner en marcha mi primera aplicación TypeScript y DefinitelyTyped Node.js, y me encuentro con algunos errores.

Recibo el error "TS2304: No se puede encontrar el nombre 'require'" cuando intento transpilar una página simple de TypeScript Node.js. He leído varias otras ocurrencias de este error en Stack Overflow, y no creo que tenga problemas similares. Estoy ejecutando en el indicador de shell el comando:

tsc movie.server.model.ts.

Los contenidos de este archivo son:

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

El error se lanza en la var mongoose=require('mongoose')línea.

Los contenidos del archivo typings / tsd.d.ts son:

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

Las referencias del archivo .d.ts se colocaron en las carpetas apropiadas y se agregaron a typings / tsd.d.ts mediante los comandos:

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

El archivo .js producido parece funcionar bien, por lo que podría ignorar el error. Pero agradecería saber por qué se produce este error y qué estoy haciendo mal.

JerryKur
fuente
1
when I attempt to transpile a simple ts node page<cómo estás transpilando ... qué utilidad
basarat
1
Solo estoy corriendo en la línea de comando escribiendo el comando: tsc movie.server.model.ts. FWIW esto está en una Mac.
JerryKur
1
El mismo problema también ocurrió en el IDE que estaba usando Visual Studio Code. Lo intentaré con mi otro IDE, IntelliJ. Supuse que pasar a la línea de comando era la forma más limpia de probar este problema.
JerryKur
¿Qué tal import { mongoose } from 'mongoose'?
FisNaN

Respuestas:

744

Rápido y sucio

Si solo tiene un archivo usando require, o lo está haciendo con fines de demostración, puede definir require en la parte superior de su archivo TypeScript.

declare var require: any

TypeScript 2.x

Si está utilizando TypeScript 2.x ya no necesita tener Typings o Definitely Typed instalado. Simplemente instale el siguiente paquete.

npm install @types/node --save-dev

El futuro de los archivos de declaración (15/06/2016)

Herramientas como Typings y tsd continuarán funcionando, y trabajaremos junto a esas comunidades para garantizar una transición sin problemas.

Verifique o edite su src /tsconfig.app.json para que contenga lo siguiente:

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

Asegúrese de que el archivo esté en la carpeta src y que no esté en la carpeta de la aplicación raíz.

Por defecto, cualquier paquete bajo @types ya está incluido en su compilación a menos que haya especificado alguna de estas opciones. Lee mas

TypeScript 1.x

Usando tipings (el reemplazo de DefinitelyTyped) puede especificar una definición directamente desde un repositorio de GitHub.

Instalar tipings

npm install typings -g --save-dev

Instale la definición de tipo requireJS del repositorio de DefinitelyType

typings install dt~node --save --global

Paquete web

Si está utilizando Webpack como su herramienta de compilación, puede incluir los tipos de Webpack.

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

Actualice su tsconfig.jsoncon lo siguiente en compilerOptions:

"types": [
      "webpack-env"
    ]

Esto le permite hacer require.ensurey otras funciones específicas de Webpack.

CLI angular

Con CLI puede seguir el paso de Webpack anterior y agregar el bloque de "tipos" a su tsconfig.app.json.

Alternativamente, puede usar los nodetipos preinstalados . Tenga en cuenta que esto incluirá tipos adicionales a su código del lado del cliente que realmente no están disponibles.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
Cgatian
fuente
44
¿Por qué no simplemente "instalar - guardar - ambiente requiere"?
kutomer
1
Me sale un error con esto Unable to find "require" ("npm") in the registry. ¿Se requiere parte de un conjunto más grande de tipings de nodeJS?
dcsan
77
Creo que esto es INCORRECTO ya que está relacionado con las tipificaciones para requireJS, no con el nodo incorporado require. tal vez sea la respuesta correcta para alguna variación del objetivo de salida ES5, pero no el caso general.
dcsan
1
Consulte jordan awnser. En mi caso, instalé los siguientes tipos @ así que agregué -> "tipos": ["nodo", "es6-promise", "core-js", "jazmín"] <- a compilerOptions en tsconfig.json
Lothre1
1
@ Gaviota @types/nodeson las definiciones de TypeScript. El nodo no incluye estos, ni deberían.
cgatian
103

Para TypeScript 2.x , ahora hay dos pasos:

  1. Instale un paquete que defina require. Por ejemplo:

    npm install @types/node --save-dev
  2. Dígale a TypeScript que lo incluya globalmente en tsconfig.json:

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

El segundo paso solo es importante si necesita acceso a funciones disponibles globalmente como require. Para la mayoría de los paquetes, solo debes usar el import package from 'package'patrón. No es necesario incluir todos los paquetes en la matriz de tipos tsconfig.json anterior.

Jordán
fuente
1
Puede usar lib para algunos es5 github.com/Microsoft/TypeScript/wiki/… Eq: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro
Después de agregar "types": ["jasmine", "hammerjs"]a tsconfig.jsHade para agregar nodetambién. Gracias Jordan
Mikeumus
Cuando sigo este consejo, se rompen todas mis importaciones. Por ejemplo, import express from "express";ahora me dice que necesito intentar instalar @ types / express o agregar un archivo .d.ts para ello.
austinthemassive
44
Si usted tiene más @types/...que un simple @types/nodecarpeta no añada "types": ["node"]en tsconfig.jsonporque mecanografiado compiller omitirá otros paquetes que no se mencionan. Esto interrumpirá la resolución de sus tipos de IDE. Está escrito aquí typescriptlang.org/docs/handbook/…
Marecky
Esa solución me funciona en un proyecto iónico sin problemas, gracias :)
Fran Sandi
71

Usted puede

declare var require: any

O, para obtener un soporte más completo, use require.d.ts de DefinitelyTyped

Además, en lugar de var mongoose = require('mongoose'), puedes probar lo siguiente

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
ᆼ ᆺ ᆼ
fuente
1
Justo sobre el uso use stricten TypeScript: ¿se necesita la respuesta basada y el "uso estricto" en un archivo TypeScript? . Es necesario usar use stricten TypeScript.
Eugene Bichel
Hm, de acuerdo con esa respuesta, no es necesario pero podría ser beneficioso usarlo "use strict",
editaré
el uso de declarar var require no soluciona el problema real; solo escondiéndolo
Mi pila se desborda el
@De acuerdo, tenga en cuenta que esto es de 2015 y, además, argumentaría que no hay ningún "problema" que solucionar. TypeScript 2.0 ahora resuelve esto elegantemente, por supuesto
ᆼ ᆺ ᆼ
12

Esta respuesta se refiere a configuraciones modernas (TypeScript 2.x, Webpack > 2.x)

Usted no necesita instalar @ tipos / nodo (que es todos los tipos y Node.js es irrelevante para el código de front-end, en realidad lo que complica las cosas tales como valores diferentes de retorno setTimout, etc ..

Usted hace necesario instalar @ tipos / webpack-env

npm i -D @types/webpack-env

que da las firmas de tiempo de ejecución que webpack tiene (incluyendo require, require.ensure, etc.)

También asegúrese de que su archivo tsconfig.json no tenga una matriz de 'tipos' establecida -> lo que hará que recoja todas las definiciones de tipo en su carpeta node_modules / @ types.

Si desea restringir la búsqueda de tipos, puede establecer la propiedad typeRoot en node_modules / @ types.

Nadav SInai
fuente
1
esta es una observación importante también asegúrese de que su tsconfig.json no tenga una matriz de 'tipos' establecida -> lo que hará que recoja todas las definiciones de tipo en su carpeta node_modules / @ types
Marecky
¿Hay otros pasos necesarios con el enfoque webpack? Me sale un error de compilación `TS2580 de error: No se puede encontrar el nombre 'require'.`
jaycer
10

En vez de:

'use strict';

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

Tratar:

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

'use strict';

es decir, la ruta de referencia primero.

Huracán
fuente
Funciona, pero como una IMO sucia, básicamente oculta el error en lugar de corregirlo. Perfecto para demos y guiones rápidos, pero no para producción
Nino Filiu
8

En mi caso, fue un problema súper estúpido, donde src/tsconfig.app.jsonestaba anulando la tsconfig.jsonconfiguración.

Entonces, tuve esto en tsconfig.json:

    "types": [
      "node"
    ]

Y este en src/tsconfig.app.json:

    "types": []

Espero que alguien encuentre esto útil, ya que este error me estaba causando canas.

h22a
fuente
8

Solo como referencia, estoy usando Angular 7.1.4 , TypeScript 3.1.6 , y lo único que necesito hacer es agregar esta línea en tsconfig.json:

    "types": ["node"], // within compilerOptions
Hearen
fuente
hizo que. Todavía tengo este error: no se puede encontrar el nombre 'requerir'. ¿Necesita instalar definiciones de tipo para nodo? Intente npm i @types/nodey luego agregue nodeal campo de tipos en su tsconfig. - ¿npm instaló?
Suisse
7

Encontré que la solución era usar el comando TSD:

tsd install node --save

Que agrega / actualiza el typings/tsd.d.tsarchivo y ese archivo contiene todas las definiciones de tipo que se requieren para una aplicación de nodo.

En la parte superior de mi archivo, pongo una referencia a tsd.d.tsesto:

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

El requerimiento se define así a partir de enero de 2016:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}
AlexStack
fuente
Tengo 404 no encontrado
bormat
5

Tomé la respuesta de Peter Varga para agregarla declare var require: any;y la convertí en una solución genérica que funciona para todos los archivos .ts genéricamente usando el preprocesador de carga :

  1. instalar preprocesador-cargador:

    npm install preprocessor-loader
  2. agregue el cargador a su webpack.config.js (estoy usando ts-loader para procesar fuentes TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Agregue la configuración que agregará la solución a cada fuente:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Puede agregar los require.d.ts más robustos de la misma manera, pero declare var require: any;fue suficiente en mi situación.

Tenga en cuenta que hay un error en el preprocesador 1.0.5 , que corta la última línea, así que asegúrese de tener un retorno de espacio de línea adicional al final y estará bien.

Benny Bottema
fuente
1
¿Por qué se rechazó esto? Responde a la pregunta y aporta algo nuevo y significativo a la mesa. Ahora no tiene que manipular cada archivo individualmente para satisfacer el transpiler y el paquete web.
Benny Bottema
¿Puedes explicar el paso 3 más? Soy un novato y no sé dónde poner este código de configuración.
user441058
@ user441058, consulte la página de GitHub , el paso 3 trata sobre la configuración principal para el preprocesador de carga.
Benny Bottema
2

He estado luchando por este problema también. Creo que esto funciona para todos los candidatos de lanzamiento, también conocido como rc, pero no lo hice. Para @angular rc.2 funciona bien.

  1. Agregar core-jscomo dependencia npm enpackage.json
  2. correr typings install core-js --save
  3. eliminar todas las "es6-shim"ocurrencias en su package.json. Ya no lo necesitas.

¡Salud!

kucherenkovova
fuente
¿Para qué sirven los tipings core-js? específico para el nodo?
dcsan
2

Asegúrate de haber instalado npm i @types/node

Rupesh Kumar Tiwari
fuente
2

importar * como mangosta de 'mangosta'

basquith16
fuente
2

Alguna vez falta "jazmín" de tsconfig.json puede causar este error. (TypeScript 2.X)

Entonces agregue

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

a su tsconfig.jsonarchivo

Samintha Kaveesh
fuente
2

Electrón + Angular 2/4 además:

Además de agregar el tipo 'nodo' a ts.config varios archivos, lo que finalmente funcionó para mí fue agregar el siguiente al typings.d.tsarchivo:

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

Tenga en cuenta que mi caso se está desarrollando con Electron + Angular 2/4. Necesitaba el requerimiento en la ventana global.

mihaa123
fuente
2

Para mí, se resuelve agregando tipos a las opciones del compilador angular.

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Farida Anjum
fuente
Está en tsconfig.json para cualquiera que quiera saber.
Stephen Zeng
1
esto es para angular 9.
Arun
1
  1. ¿Especificó qué módulo usar para transpilar el código?
    tsc --target es5 --module commonjs script.ts
    Debe hacer eso para que el transpilador sepa que está compilando el código NodeJS. Doc .

  2. También debe instalar definiciones de mangosta
    tsd install mongoose --save

  3. No lo use varpara declarar variables (a menos que sea necesario, lo cual es un caso muy raro), use leten su lugar. Aprende más sobre eso

Ayman Nedjmeddine
fuente
1

Solo además de la respuesta de cgatian, para TypeScript 1.x

Si todavía ve errores, proporcione específicamente index.d.ts en las opciones de su compilador.

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

No pude obtener el error 'requerir' para desaparecer usando cualquiera de los trucos anteriores.

Pero descubrí que el problema era que mis herramientas TypeScript para Visual Studio tenían una versión anterior (1.8.6.0) y la última versión actual (2.0.6.0).

Puede descargar la última versión de las herramientas desde:

TypeScript para Visual Studio 2015

Thomas
fuente
1

Si puede compilar código, pero Visual Studio 2015 marca las funciones 'require' ya que los errores con texto de error no pueden encontrar el nombre 'require' o no pueden resolver el símbolo 'require' , actualice TypeScript para Visual Studio 2015 a la última versión (en este momento 2.1. 5) y actualice ReSharper (si lo usa) a al menos la versión 2016.3.2.

Tuve este molesto problema por un tiempo y no pude encontrar una solución, pero finalmente lo resolví de esta manera.

Mike Eshva
fuente
1

Agregue lo siguiente en tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]
Darshan Ballal
fuente
2
Esto ya se menciona en la respuesta de @ cgatian .
tuomastik
@cgatian ha mencionado "node_modules / @ types" mientras que he mencionado "../node_modules/@types".
Darshan Ballal
1

Tengo otra respuesta que se basará en todos los anteriores que describen npm install @types/nodee incluidos nodeen tsconfig.json / compilerOptions / types.

En mi caso, tengo una base tsConfig.jsony una separada en la aplicación Angular que extiende esta:

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

Mi problema fue el vacío typesen esto tsconfi.app.json: cambia el que está en la configuración base.

HankCa
fuente
-2

Si enfrenta este problema en un archivo .ts que solo está allí para proporcionarle valores constantes, entonces puede simplemente

cambie el nombre de su archivo .ts a archivo .js

y el error no vendrá de nuevo.

Aavgeen singh
fuente