TypeScript obtendo o erro TS2304: não é possível encontrar o nome 'require'

463

Estou tentando colocar meu primeiro aplicativo TypeScript e DefinitelyTyped Node.js em execução e com alguns erros.

Estou recebendo o erro "TS2304: Não é possível encontrar o nome 'require'" quando tento transpilar uma página simples do TypeScript Node.js. Eu li várias outras ocorrências desse erro no Stack Overflow e não acho que tenha problemas semelhantes. Estou executando no prompt de shell do comando:

tsc movie.server.model.ts.

O conteúdo deste arquivo é:

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

O erro é lançado na var mongoose=require('mongoose')linha.

O conteúdo do arquivo typings / tsd.d.ts é:

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

As referências do arquivo .d.ts foram colocadas nas pastas apropriadas e adicionadas às typings / tsd.d.ts pelos comandos:

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

O arquivo .js produzido parece funcionar bem, então eu poderia ignorar o erro. Mas eu gostaria de saber por que esse erro ocorre e o que estou fazendo de errado.

JerryKur
fonte
1
when I attempt to transpile a simple ts node page<Como você transpiling ... qual utilitário
basarat
1
Estou apenas executando na linha de comando, digitando o comando: tsc movie.server.model.ts. FWIW isso está em um Mac.
precisa saber é o seguinte
1
O mesmo problema também ocorreu no IDE que eu estava usando o Visual Studio Code. Vou tentar meu outro IDE, IntelliJ. Presumi que cair na linha de comando era a maneira mais limpa de testar esse problema.
precisa saber é o seguinte
Que tal import { mongoose } from 'mongoose'?
FisNaN

Respostas:

744

Rapido e sujo

Se você tiver apenas um arquivo usando o require ou estiver fazendo isso para fins de demonstração, poderá definir o request na parte superior do seu arquivo TypeScript.

declare var require: any

TypeScript 2.x

Se você estiver usando o TypeScript 2.x, não precisará mais ter o Typings ou Definitely Type digitado. Simplesmente instale o seguinte pacote.

npm install @types/node --save-dev

O futuro dos arquivos da declaração (15/6/2016)

Ferramentas como Typings e tsd continuarão funcionando, e trabalharemos ao lado dessas comunidades para garantir uma transição suave.

Verifique ou edite seu src /tsconfig.app.json para que ele contenha o seguinte:

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

Verifique se o arquivo está na pasta src e não na pasta do aplicativo raiz.

Por padrão, qualquer pacote em @types já está incluído no seu build, a menos que você tenha especificado uma dessas opções. Consulte Mais informação

TypeScript 1.x

Usando tipagens (substituição do DefinitelyTyped), você pode especificar uma definição diretamente de um repositório do GitHub.

Instalar tipografias

npm install typings -g --save-dev

Instale a definição de tipo requireJS no repositório do DefinitelyType

typings install dt~node --save --global

Webpack

Se você estiver usando o Webpack como sua ferramenta de construção, poderá incluir os tipos de Webpack.

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

Atualize seu tsconfig.jsoncom o seguinte em compilerOptions:

"types": [
      "webpack-env"
    ]

Isso permite que você faça require.ensuree outras funções específicas do Webpack.

CLI angular

Com a CLI, você pode seguir a etapa Webpack acima e adicionar o bloco "types" ao seu tsconfig.app.json.

Como alternativa, você pode usar os nodetipos pré-instalados . Lembre-se de que isso incluirá tipos adicionais no código do lado do cliente que não estão realmente disponíveis.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
cgatian
fonte
4
por que não apenas "digitar install --save --ambient exigem"?
precisa saber é o seguinte
1
Eu recebo um erro com isso Unable to find "require" ("npm") in the registry. Requer parte de um conjunto maior de tipações nodeJS?
dcsan
7
Eu acho que isso é ERRADO, pois está relacionado a digitações para requireJS, e não ao nó incorporado require. talvez seja a resposta certa para algumas variações da meta de saída do ES5, mas não no caso geral.
dcsan
1
Por favor, consulte jordan awnser. No meu caso, eu instalei os seguintes @types e adicionei -> "types": ["node", "es6-promessa", "core-js", "jasmim"] <- ao compilerOptions no tsconfig.json
Lothre1
1
@ Seagull @types/nodesão as definições de TypeScript. O nó não inclui isso, nem deveria.
precisa saber é
103

Para o TypeScript 2.x , agora existem duas etapas:

  1. Instale um pacote que define require. Por exemplo:

    npm install @types/node --save-dev
  2. Diga ao TypeScript para incluí-lo globalmente em tsconfig.json:

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

A segunda etapa é importante apenas se você precisar acessar funções disponíveis globalmente, como require. Para a maioria dos pacotes, você deve apenas usar o import package from 'package'padrão. Não há necessidade de incluir todos os pacotes na matriz de tipos tsconfig.json acima.

Jordânia
fonte
1
Você pode usar lib para alguns es5 github.com/Microsoft/TypeScript/wiki/… Eq: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro
Depois de adicionar "types": ["jasmine", "hammerjs"]ao tsconfig.jsIde adicionar nodetambém. Obrigado Jordan.
Mikeumus
Quando sigo este conselho, ele quebra todas as minhas importações. Por exemplo, import express from "express";agora está me dizendo que preciso tentar instalar o @ types / express ou adicionar um arquivo .d.ts.
austinthemassive
4
Se você tiver mais do @types/...que apenas uma @types/nodepasta, não adicione "types": ["node"], tsconfig.jsonporque o compilador TypeScript omitirá outros pacotes não mencionados. Isso interromperá a resolução dos tipos de IDEs. Está escrito aqui typescriptlang.org/docs/handbook/…
Marecky 30/03
Que funciona solução para mim em um projeto iônica sem problemas, obrigado :)
Fran Sandi
71

Você pode

declare var require: any

Ou, para um suporte mais abrangente, use o arquivo require.d.ts do DefinitelyTyped

Além disso, em vez de var mongoose = require('mongoose'), você pode tentar o seguinte

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
ᆼ ᆺ ᆼ
fonte
1
Sobre o uso use strictno TypeScript: resposta basarat e "Use Strict" necessários em um arquivo TypeScript? . É necessário usar use strictno TypeScript.
Eugene Bichel 28/11
Hm, de acordo com essa resposta não é necessário, mas pode ser benéfico para uso "use strict", eu vou editar a minha resposta
ᆼ ᆺ ᆼ
o uso de declarar var require não está corrigindo o problema real; apenas escondendo isso.
minha pilha transbordou
@ Bem, lembre-se de que é de 2015 e também argumentaria que não há "problema" para corrigir. Agora o TypeScript 2.0 resolve isso de forma elegante, é claro
#: 5516
12

Esta resposta está relacionada às configurações modernas (TypeScript 2.x, Webpack > 2.x)

Você não precisa instalar @ types / node (que é todos os tipos de Node.js. e é irrelevante para o código de front-end, na verdade complica coisas como setTimout diferentes valores de retorno, etc.

Você fazer necessidade de instalar @ tipos / Webpack-env

npm i -D @types/webpack-env

que dá as assinaturas de execução que tem Webpack (incluindo require, require.ensureetc.)

Verifique também se o seu arquivo tsconfig.json não possui uma matriz 'types' definida -> o que fará com que todas as definições de tipos sejam capturadas na pasta node_modules / @ types.

Se você deseja restringir a pesquisa de tipos, é possível configurar a propriedade typeRoot como node_modules / @ types.

Nadav SInai
fonte
1
isso é observação importante também certificar-se de que o seu tsconfig.json tem variedade nenhum conjunto de 'tipos' -> o que tornará captador todas as definições de tipo em seus node_modules pasta / @ tipos
Marecky
Existem outras etapas necessárias com a abordagem do webpack? Eu recebo um erro de compilação `` erro TS2580: Não foi possível encontrar o nome 'require'. ''
jaycer 24/01
10

Ao invés de:

'use strict';

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

Tentar:

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

'use strict';

ou seja, caminho de referência primeiro.

Furacão
fonte
Funciona, mas meio IMO sujo - basicamente oculta o erro em vez de corrigi-lo. Perfeito para demonstrações e scripts rápidos, mas não para a produção
Nino Filiu
8

No meu caso, foi um problema super estúpido, em que o src/tsconfig.app.jsonestava substituindo a tsconfig.jsonconfiguração.

Então, eu tive isso em tsconfig.json:

    "types": [
      "node"
    ]

E este em src/tsconfig.app.json:

    "types": []

Espero que alguém ache isso útil, pois esse erro estava me causando cabelos grisalhos.

h22a
fonte
8

Apenas para referência, estou usando o Angular 7.1.4 , TypeScript 3.1.6 , e a única coisa que preciso fazer é adicionar esta linha tsconfig.json:

    "types": ["node"], // within compilerOptions
Hearen
fonte
fez isso. Ainda recebi este erro: Não foi possível encontrar o nome 'require'. Você precisa instalar definições de tipo para o nó? Tente npm i @types/nodee adicione nodeao campo de tipos no seu tsconfig. - o npm foi instalado.
Suisse
7

Eu achei que a solução era usar o comando TSD:

tsd install node --save

Que adiciona / atualiza o typings/tsd.d.tsarquivo e esse arquivo contém todas as definições de tipo necessárias para um aplicativo de nó.

No topo do meu arquivo, eu coloquei uma referência tsd.d.tscomo esta:

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

O requisito é definido assim em janeiro de 2016:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}
AlexStack
fonte
Eu tenho 404 não encontrado
bormat
5

Peguei a resposta de Peter Varga para adicioná-la declare var require: any;e a converti em uma solução genérica que funciona para todos os arquivos .ts genericamente usando o pré-processo-loader :

  1. instale o pré-processador-carregador:

    npm install preprocessor-loader
  2. adicione o carregador ao seu webpack.config.js (estou usando o ts-loader para processar fontes TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Adicione a configuração que adicionará a solução alternativa a todas as fontes:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Você pode adicionar o require.d.ts mais robusto da mesma maneira, mas declare var require: any;foi suficiente na minha situação.

Observe que há um erro no pré-processador 1.0.5 , que interrompe a última linha; portanto, verifique se você tem um retorno extra de espaço de linha no final e se está bem.

Benny Bottema
fonte
1
Por que isso foi prejudicado? Ele responde à pergunta e traz algo novo e significativo para a mesa. Agora você não precisa alterar todos os arquivos individualmente para satisfazer o transpiler e o webpack.
Benny Bottema
Você pode explicar mais o passo 3? Eu sou um newb e não sei onde colocar esse código de configuração.
user441058
@ user441058, consulte a página do GitHub , a etapa 3 é sobre a principal configuração do pré-processador de carga.
Benny Bottema
2

Eu também tenho lutado com esse problema. Acredito que isso funcione para todos os candidatos a lançamento, também conhecidos como rc, mas não testei. Para @ rectangular rc.2 , funciona bem.

  1. Adicionar core-jscomo dependência npm empackage.json
  2. corre typings install core-js --save
  3. remova todas as "es6-shim"ocorrências no seu package.json. Você não precisa mais disso.

Felicidades!

kucherenkovova
fonte
para que servem as tipificações core-js? específico para o nó?
dcsan
2

Verifique se você instalou npm i @types/node

Rupesh Kumar Tiwari
fonte
2

importação * como mangusto de 'mangusto'

basquith16
fonte
2

Às vezes, a falta de "jasmim" do tsconfig.json pode causar esse erro. (TypeScript 2.X)

Então adicione

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

para o seu tsconfig.jsonarquivo.

Samintha Kaveesh
fonte
2

Adição de elétron + angular 2/4:

Além de adicionar o tipo 'node' aos vários arquivos ts.config, o que funcionou para mim foi adicionar o próximo ao typings.d.tsarquivo:

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

Observe que meu caso está se desenvolvendo com Electron + Angular 2/4. Eu precisava da exigência na janela global.

mihaa123
fonte
2

Para mim, isso é resolvido adicionando tipos às opções do compilador angular.

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Farida Anjum
fonte
Está em tsconfig.json para quem quiser saber.
Stephen Zeng
1
isto é para angular 9.
Arun
1
  1. Você especificou qual módulo usar para transpilar o código?
    tsc --target es5 --module commonjs script.ts
    Você deve fazer isso para que o transpiler saiba que está compilando o código NodeJS. Docs .

  2. Você também deve instalar definições de mangusto
    tsd install mongoose --save

  3. Não use varpara declarar variáveis ​​(a menos que necessário, que é um caso muito raro), use em seu letlugar. Saiba mais sobre isso

Ayman Nedjmeddine
fonte
1

Além da resposta da cgatian, para o TypeScript 1.x

Se você ainda estiver vendo erros, forneça index.d.ts especificamente nas opções do seu compilador.

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

Não foi possível obter o erro 'exigir' para desaparecer usando qualquer um dos truques acima.

Mas descobri que o problema era que minhas ferramentas TypeScript para o Visual Studio eram uma versão antiga (1.8.6.0) e a versão mais recente de hoje (2.0.6.0).

Você pode baixar a versão mais recente das ferramentas em:

TypeScript para Visual Studio 2015

Thomas
fonte
1

Se você puder compilar o código, mas as marcas 'require' do Visual Studio 2015 funcionarem, pois os erros com o texto do erro não podem encontrar o nome 'require' ou não podem resolver o símbolo 'require' , atualize o TypeScript for Visual Studio 2015 para a versão mais recente (no momento 2.1. 5) e atualize o ReSharper (se você o usar) para pelo menos a versão 2016.3.2.

Eu tive esse problema irritante por um tempo e não consegui encontrar uma solução, mas finalmente resolvi dessa maneira.

Mike Eshva
fonte
1

Adicione o seguinte em tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]
Darshan Ballal
fonte
2
Isso já foi mencionado na resposta de @ cgatian .
tuomastik
@cgatian mencionou "node_modules / @ types" enquanto eu mencionei "../node_modules/@types".
Darshan Ballal 30/10
1

Eu tenho ainda uma outra resposta que se baseia em todas as anteriores que descrevem npm install @types/nodee inclusive nodeno tsconfig.json / compilerOptions / types.

No meu caso, eu tenho uma base tsConfig.jsone uma separada no aplicativo Angular que estende esse:

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

Meu problema era o vazio typesnisso tsconfi.app.json- ele derruba aquele na configuração base.

HankCa
fonte
-2

Se você estiver enfrentando esse problema em um arquivo .ts, que existe apenas para fornecer alguns valores constantes, basta

renomeie o arquivo .ts para o arquivo .js

e o erro não voltará.

Aavgeen singh
fonte