node.js - TypeScript recebendo erro TS2304: não é possível encontrar o nome 'require'
Estou tentando colocar meu primeiro aplicativo Node.js com TypeScript e DefinitelyTyped em funcionamento, e estou enfrentando alguns erros.
Estou recebendo o erro "TS2304: Cannot find name 'require'" quando tento transpilar uma página simples de TypeScript Node.js. Eu li várias outras ocorrências desse erro no Stack Overflow, e não acho que tenho problemas semelhantes. Estou executando no prompt do shell o 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 linha var mongoose=require('mongoose').
O conteúdo do arquivo typings/tsd.d.ts é:
/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />
As referências de arquivos .d.ts foram colocadas nas pastas apropriadas e adicionadas a 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 apreciaria saber por que esse erro ocorre e o que estou fazendo de errado.
Resposta #1
Rápido e Sujo
Se você tiver apenas um arquivo usando require, ou estiver fazendo isso para fins de demonstração, você pode definir require no topo do seu arquivo TypeScript.
declare var require: any
TypeScript 2.x
Se você estiver usando TypeScript 2.x, você não precisa mais ter Typings ou Definitely Typed instalados. Basta instalar o seguinte pacote.
npm install @types/node --save-dev
O Futuro dos Arquivos de Declaração (15/06/2016)
Ferramentas como Typings e tsd continuarão a funcionar, e estaremos trabalhando junto com essas comunidades para garantir uma transição suave.
Verifique ou edite seu src/tsconfig.app.json para que contenha o seguinte:
...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...
Certifique-se de que o arquivo está na pasta src e não na pasta raiz do aplicativo.
Por padrão, qualquer pacote sob @types já está incluído na sua compilação a menos que você tenha especificado uma dessas opções. Leia mais
TypeScript 1.x
Usando typings (substituto do DefinitelyTyped) você pode especificar uma definição diretamente de um repositório do GitHub.
Instalar typings
npm install typings -g --save-dev
Instale a definição de tipo requireJS do repositório do DefinitelyType
typings install dt~node --save --global
Webpack
Se você estiver usando o Webpack como sua ferramenta de build, você pode incluir os tipos do Webpack.
npm install --save-dev @types/webpack-env
Atualize seu tsconfig.json com o seguinte em compilerOptions:
"types": [
"webpack-env"
]
Isso permite que você use require.ensure e outras funções específicas do Webpack.
Angular CLI
Com o CLI, você pode seguir a etapa do Webpack acima e adicionar o bloco "types" ao seu tsconfig.app.json.
Alternativamente, você poderia usar os tipos node pré-instalados. Lembre-se de que isso incluirá tipos adicionais ao seu código do lado do cliente que na verdade não estão disponíveis.
"compilerOptions": {
// other options
"types": [
"node"
]
}
Resposta #2
Para TypeScript 2.x, agora existem dois passos:
Instale um pacote que defina
require. Por exemplo:npm install @types/node --save-devDiga ao TypeScript para incluí-lo globalmente em
tsconfig.json:{ "compilerOptions": { "types": ["node"] } }
O segundo passo é importante apenas se você precisar acessar funções disponíveis globalmente, como require. Para a maioria dos pacotes, você deve apenas usar o padrão import package from 'package'. Não há necessidade de incluir todos os pacotes no array de tipos do tsconfig.json acima.
Resposta #3
Você pode
declare var require: any
Ou, para um suporte mais completo, use o require.d.ts do DefinitelyTyped
Além disso, em vez de var mongoose=require('mongoose'), você poderia tentar o seguinte
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
Resposta #4
No meu caso, era um problema super estúpido, onde o src/tsconfig.app.json estava sobrescrevendo a configuração do tsconfig.json.
Então, eu tinha 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.
Resposta #5
Esta resposta se refere a configurações modernas (TypeScript 2.x, Webpack > 2.x)
Você não precisa instalar @types/node (que são todos os tipos do Node.js e são irrelevantes para código front-end, na verdade complicando coisas como valores de retorno diferentes do setTimeout, etc..
Você realmente precisa instalar @types/webpack-env
npm i -D @types/webpack-envque fornece as assinaturas de tempo de execução que o Webpack possui (incluindo require, require.ensure, etc.)
Também verifique se o arquivo tsconfig.json não possui um array 'types' definido -> o que fará com que ele pegue todas as definições de tipos na sua pasta node_modules/@types.
Se você quiser restringir a pesquisa de tipos, pode definir a propriedade typeRoot para node_modules/@types.
Resposta #6
Apenas para referência, estou usando Angular 7.1.4, TypeScript 3.1.6, e a única coisa que eu preciso fazer é adicionar esta linha em tsconfig.json:
"types": ["node"], // within compilerOptions
Resposta #7
Em vez de:
'use strict';
/// <reference path="typings/tsd.d.ts" />
Tente :
/// <reference path="typings/tsd.d.ts" />
'use strict';
ou seja, caminho de referência primeiro.
