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.
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
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"
]
}
}
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
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.
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"
]
}
Pour TypeScript 2.x , il y a maintenant deux étapes:
Installez un paquet qui définit require
. Par exemple:
npm install @types/node --save-dev
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.
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')
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.
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[];
}
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
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 :
installer pré-processeur-chargeur:
npm install preprocessor-loader
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'
}]
}
{
"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.
Assurez-vous d'avoir installé npm i @types/node
importer * en tant que mangouste à partir de 'mangouste'
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.
core-js
comme dépendance npm dans package.json
typings install core-js --save
"es6-shim"
dans votre package.json
. Vous n'en avez plus besoin.À votre santé!
Parfois manquant "jasmine" de tsconfig.json peut provoquer cette erreur (TypeScript 2.X)
alors ajoutez
"types": [
"node",
"jasmine"
]
à votre tsconfig.json
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.
Ajouter ce qui suit dans tsconfig.json
:
"typeRoots": [ "../node_modules/@types" ]
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.
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"
]
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 .
Vous devez également installer les définitions de mangoustetsd install mongoose --save
N'utilisez pas var
pour déclarer des variables (sauf si nécessaire, ce qui est un cas très rare), utilisez plutôt let
En savoir plus à ce sujet
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.
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.
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