Ich versuche, meine erste TypeScript- und DefinitelyTyped-Knoten-App zum Laufen zu bringen und dabei auf einige Fehler zu stoßen.
Ich erhalte die Fehlermeldung "TS2304: Name 'Require' kann nicht gefunden werden", wenn ich versuche, eine einfache TS-Knotenseite zu transpilieren. Ich habe einige andere Vorkommen dieses Fehlers in SO durchgelesen und glaube nicht, dass ich ähnliche Probleme habe.
Ich führe an der Shell-Eingabeaufforderung den Befehl aus: tsc movie.server.model.ts. Der Inhalt dieser Datei ist:
'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';
Der Fehler wird in der Zeile var mongoose = required ('mongoose') ausgegeben
Die Datei typings/tsd.d.ts enthält folgende Inhalte:
/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />
Die .d.ts-Dateiverweise wurden in den entsprechenden Ordnern abgelegt und mit den Befehlen zu typings/tsd.d.ts hinzugefügt:
tsd install node --save
tsd install require --save
Die erzeugte .js-Datei scheint gut zu funktionieren, daher könnte ich den Fehler ignorieren. Aber ich würde es zu schätzen wissen, warum dieser Fehler auftritt und was ich falsch mache.
Wenn Sie nur eine Datei mit request haben oder dies zu Demonstrationszwecken tun, können Sie die Anforderung oben in Ihrer TypeScript-Datei definieren.
declare var require: any
Wenn Sie TypeScript 2.x verwenden, müssen Sie nicht mehr Typings oder Definitely Typed installieren. Installieren Sie einfach das folgende Paket.
npm install @types/node --save-dev
Die Zukunft der Deklarationsdateien (15.06.2016)
Tools wie Typings und tsd funktionieren weiterhin und wir arbeiten neben diesen Gemeinschaften, um einen reibungslosen Übergang zu gewährleisten.
OPTIONAL:.__ Wenn Sie typeroots
oder types
in Ihrem tsconfig.json
angeben Möglicherweise müssen Sie den tsconfig.json
aktualisieren, um den Knoten als Typ einzuschließen. Standardmäßig ist jedes Paket unter @types bereits in Ihrem Build sofern nicht enthalten, wenn Sie eine dieser Optionen angegeben haben. Weiterlesen
Nachfolgend finden Sie die richtige Konfiguration für jede dieser Optionen.
{
"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"
]
}
}
Mithilfe von Typisierungen (DefinitelyTyped-Ersetzung) können Sie eine Definition direkt aus einem GitHub-Repository angeben.
Installieren Sie Typisierungen
npm install typings -g --save-dev
Installieren Sie die Definition des RequiredJS-Typs aus dem Repo von DefinitelyType
typings install dt~node --save --global
Wenn Sie Webpack als Build-Tool verwenden, können Sie die Webpack-Typen einschließen.
npm install --save-dev @ types/webpack-env
Aktualisieren Sie Ihren tsconfig.json
mit folgendem unter compilerOptions
:
"types": [
"webpack-env"
]
Auf diese Weise können Sie require.ensure
und andere webpackspezifische Funktionen ausführen.
Mit der CLI können Sie dem oben genannten Webpack-Schritt folgen und den "type" -Block zu Ihrem tsconfig.app.json
hinzufügen.
Alternativ können Sie die vorinstallierten node
-Typen verwenden. Beachten Sie, dass dies zusätzliche Typen Ihres clientseitigen Codes enthält, die nicht wirklich verfügbar sind.
"compilerOptions": {
// other options
"types": [
"node"
]
}
Für TypeScript 2.x gibt es jetzt zwei Schritte:
Installieren Sie ein Paket, das require
definiert. Zum Beispiel:
npm install @types/node --save-dev
Sagen Sie TypeScript, es global in tsconfig.json
einzuschließen:
{
"compilerOptions": {
"types": ["node"]
}
}
Der zweite Schritt ist nur wichtig, wenn Sie Zugriff auf global verfügbare Funktionen wie require
benötigen. Für die meisten Pakete sollten Sie einfach das import package from 'package'
-Muster verwenden. Es ist nicht erforderlich, jedes Paket in das Array tsconfig.json types aufzunehmen.
Sie können
declare var require: any
Um eine umfassendere Unterstützung zu erhalten, verwenden Sie DefinitelyTyped-Requests.d.ts
Anstelle von var mongoose = require('mongoose')
können Sie auch Folgendes versuchen
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
Anstatt:
'use strict';
/// <reference path="typings/tsd.d.ts" />
Versuchen:
/// <reference path="typings/tsd.d.ts" />
'use strict';
referenzpfad zuerst.
Ich fand die Lösung, den TSD-Befehl zu verwenden:
tsd install node --save
Durch das Hinzufügen/Aktualisieren der typings/tsd.d.ts
-Datei und dieser Datei werden alle Typdefinitionen gespeichert, die für eine Knotenanwendung erforderlich sind.
Am Anfang meiner Datei füge ich einen Verweis auf den tsd.d.ts
hinzu:
/// <reference path="../typings/tsd.d.ts" />
Die Anforderung ist ab Januar 2016 wie folgt definiert:
declare var require: NodeRequire;
interface NodeModule {
exports: any;
require: NodeRequireFunction;
id: string;
filename: string;
loaded: boolean;
parent: any;
children: any[];
}
Diese Antwort bezieht sich auf moderne Setups (TypeScript 2.x, Webpack> 2.x)
sie brauchen NICHT @ types/node zu installieren (was alle Typen von node.js ist und für Front-End-Code nicht relevant ist, was Dinge wie setTimout, unterschiedlichen Rückgabewert usw. kompliziert macht.
sie müssen @ types/webpack-env installieren
npm i -D @types/webpack-env
gibt die Laufzeitsignaturen an, die das Webpack besitzt (einschließlich Required und Request.ensure usw.).
stellen Sie außerdem sicher, dass Ihre Datei tsconfig.json kein Set-Typen-Array -> hat. Dadurch werden alle Typdefinitionen in Ihrem Ordner node_modules/@ types . übernommen zu node_modules/@ types
Ich nahm Peter Vargas Antwort , um declare var require: any;
hinzuzufügen, und machte daraus eine generische Lösung, die für alle .ts-Dateien generisch funktioniert, indem der preprocess-loader verwendet wird:
preprozessor-Loader installieren:
npm install preprocessor-loader
fügen Sie den Loader zu Ihrer webpack.config.js hinzu (ich verwende ts-loader für die Verarbeitung von TypeScript-Quellen):
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; })"
}]
}
Sie können das robustere requir.d.ts auf dieselbe Weise hinzufügen, aber declare var require: any;
war in meiner Situation ausreichend.
Beachten Sie, es gibt einen Fehler in Preprozessor 1.0.5 , der die letzte Zeile abschneidet. Stellen Sie also sicher, dass Sie am Ende einen zusätzlichen Zeilenabstand haben, und Sie werden zufrieden sein.
Stellen Sie sicher, dass Sie npm i @types/node
installiert haben.
import * als Mungo aus 'Mungo'
Ich habe auch mit dieser Ausgabe zu kämpfen. Ich glaube, das funktioniert für alle release-Kandidaten aka rc, aber ich habe es nicht getestet. Für @angular rc.2 funktioniert es gut.
core-js
als npm-Abhängigkeit in package.json
hinzu.typings install core-js --save
ausführen"es6-shim"
Vorkommnisse in Ihrem package.json
. Du brauchst es nicht mehr.Prost!
Manchmal kann "jasmine" aus tsconfig.json fehlen, was zu diesem Fehler führen kann. (TypeScript 2.X)
so hinzufügen
"types": [
"node",
"jasmine"
]
an Ihre tsconfig.json
Hinzufügen von Elektron + Winkel 2/4: Neben dem Hinzufügen von 'node' zu den verschiedenen Dateien von ts.config haben sich letztendlich die folgenden Dateien hinzugefügt:.
declare var window: Window;
interface Window {
process: any;
require: any;
}
Beachten Sie, dass sich mein Fall mit Elektron + Winkel 2/4 entwickelt. Ich brauchte die Anforderung am Fenster global.
Fügen Sie Folgendes in tsconfig.json
hinzu:
"typeRoots": [ "../node_modules/@types" ]
Nur als Referenz verwende ich Angular 7.1.4 , TypeScript 3.1.6 und das einzige, was ich tun muss, ist diese Zeile in tsconfig.json
hinzuzufügen.
"types": ["node"], // within compilerOptions
Ich hoffe es kann helfen.
Nur zusätzlich zu cgatians Antwort für TypeScript 1.x
Wenn Sie immer noch Fehler sehen, geben Sie bitte spezifisch index.d.ts in Ihren Compileroptionen an.
"files": [
"typings/index.d.ts"
]
Haben Sie angegeben, mit welchem Modul der Code transpiliert werden soll?tsc --target es5 --module commonjs script.ts
Sie müssen dies tun, um den Transpiler wissen zu lassen, dass Sie NodeJS-Code kompilieren. Dokumente .
Sie müssen auch Mungo-Definitionen installierentsd install mongoose --save
Verwenden Sie var
nicht zur Deklaration von Variablen (es sei denn, dies ist ein sehr seltener Fall), sondern verwenden Sie let
. Erfahren Sie mehr darüber
Ich habe noch eine andere Antwort, die auf allen vorherigen Antworten aufbaut, die npm install @types/node
beschreiben und node
in tsconfig.json / compilerOptions / types
aufnehmen.
In meinem Fall habe ich einen Basis tsConfig.json
und einen separaten Code in der App Angular, der diesen erweitert:
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": []
},
Mein Problem war die leere types
in diesem tsconfi.app.json
- sie löscht die in der Basiskonfiguration.
Wenn Sie Code kompilieren können, aber in Visual Studio 2015 "Requirement" -Funktionen als Fehler mit dem Fehlertext Name "Requires" kann nicht gefunden werden kannoder Symbol "Required" kann nicht aufgelöst werden update TypeScript für Visual Studio 2015 auf die neueste Version (derzeit 2.1.5) und aktualisieren Sie ReSharper (falls Sie es verwenden) mindestens auf Version 2016.3.2.
Ich hatte dieses nervige Problem für eine Weile, konnte keine Lösung finden, löste es aber schließlich auf diese Weise. Hoffe das hilft jemandem.
Ich konnte den "Erfordernis" -Fehler nicht durch Verwendung der oben genannten Tricks beheben.
aber ich fand heraus, dass das Problem darin bestand, dass meine TypeScript-Tools für Visual Studio, in denen eine alte Version (1.8.6.0) und die neueste Version von heute (2.0.6.0) ist, liegen
Sie können die neueste Version der Tools herunterladen:
https://www.Microsoft.com/de-de/download/details.aspx?id=48593