Ich habe gelesen, wie die Auflösung des TypeScript- Moduls funktioniert.
Ich habe das folgende Repository: @ ts-stack / di . Nach dem Kompilieren lautet die Verzeichnisstruktur wie folgt:
├── dist
│ ├── annotations.d.ts
│ ├── annotations.js
│ ├── index.d.ts
│ ├── index.js
│ ├── injector.d.ts
│ ├── injector.js
│ ├── profiler.d.ts
│ ├── profiler.js
│ ├── providers.d.ts
│ ├── providers.js
│ ├── util.d.ts
│ └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│ ├── annotations.ts
│ ├── index.ts
│ ├── injector.ts
│ ├── profiler.ts
│ ├── providers.ts
│ └── util.ts
└── tsconfig.json
In meine package.json habe ich geschrieben "main": "dist/index.js"
.
In Node.js funktioniert alles gut, aber TypeScript:
import {Injector} from '@ts-stack/di';
Es konnte keine Deklarationsdatei für das Modul '@ ts-stack / di' gefunden werden. '/path/to/node_modules/@ts-stack/di/dist/index.js' hat implizit einen 'any'-Typ.
Und doch, wenn ich wie folgt importiere, dann funktioniert alles:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Was mache ich falsch?
quelle
npm install @types/node --save-dev
require
anstelle vonimport
ist ein bisschen ein Anti-Pattern: Es ist besser, das Modul in einer.d.ts
Datei zu deklarieren . siehe meine Antwort unten.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Wenn Sie ein Modul eines Drittanbieters
'foo'
importieren, das weder in der Bibliothek selbst noch im@types/foo
Paket (generiert aus dem DefinitelyTyped- Repository) Typisierungen bereitstellt, können Sie diesen Fehler beheben, indem Sie das Modul in a deklarieren Datei mit einer.d.ts
Erweiterung. TypeScript sucht.d.ts
an denselben Stellen nach.ts
Dateien wie nach normalen Dateien: wie unter "Dateien", "Einschließen" und "Ausschließen" in der Datei angegebentsconfig.json
.Wenn Sie dann importieren, wird
foo
es einfach als eingegebenany
.Wenn Sie Ihre eigenen Eingaben rollen möchten, können Sie dies auch tun:
Dann wird dies korrekt kompiliert:
Sie müssen keine vollständigen Typisierungen für das Modul bereitstellen, gerade genug für die Bits, die Sie tatsächlich verwenden (und für die Sie die richtigen Typisierungen wünschen). Dies ist besonders einfach, wenn Sie eine relativ kleine Menge an API verwenden.
Wenn Sie sich jedoch nicht für die Typisierung externer Bibliotheken interessieren und möchten, dass alle Bibliotheken ohne Typisierung als importiert werden
any
, können Sie dies einer Datei mit der folgenden.d.ts
Erweiterung hinzufügen :Der Vorteil (und Nachteil) davon ist, dass Sie absolut alles importieren können und TS kompiliert.
quelle
d.ts
Dateien? sollten Sie eine Konfiguration wie bereitstellentypeRoots
?.d.ts
Dateien an den gleichen Stellen wie nach normalen.ts
Dateien: wie angegeben "Dateien", "Einschließen" und "Ausschließen" in dertsconfig.json
. Ich würde die VerwendungtypeRoots
für diesen Zweck nicht empfehlen : Dies ist für den Speicherort externer Typmodule (dhnode_modules/@types
) vorgesehen, nicht für einzelne.d.ts
Dateien..d.ts
Datei ablegen?Wenn Sie eine schnelle Lösung benötigen, fügen Sie diese einfach vor der Zeile Ihres Imports hinzu:
quelle
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Das Gefühl , wenn man zwei Tage lang suchen und es so finden: einfach entfernen
.js
aus"main": "dist/index.js"
inpackage.json
und alles funktioniert!UPD : Diese Antwort ist relativ, wenn Sie Ihr eigenes npm-Paket haben, wenn nicht - siehe meine Antwort unten .
Und wenn oben genannte Antwort nicht importieren Ihr Modul behoben, versuchen Sie fügen Sie einfach
typings
inpackage.json
:Natürlich hier Ordner
dist
- hier werden die Dateien Ihres Moduls gespeichert.quelle
declare module "moduleName"
in der Zwischenzeit einfügenTypeScript implementiert im Wesentlichen Regeln und fügt Ihrem Code Typen hinzu, um ihn klarer und genauer zu machen, da in Javascript keine Einschränkungen bestehen. Bei TypeScript müssen Sie Ihre Daten beschreiben, damit der Compiler Ihren Code überprüfen und Fehler finden kann. Der Compiler informiert Sie, wenn Sie nicht übereinstimmende Typen verwenden, wenn Sie sich außerhalb Ihres Gültigkeitsbereichs befinden oder wenn Sie versuchen, einen anderen Typ zurückzugeben. Wenn Sie externe Bibliotheken und Module mit TypeScript verwenden, müssen diese Dateien enthalten, die die Typen in diesem Code beschreiben. Diese Dateien werden als Typdeklarationsdateien mit einer Erweiterung bezeichnet
d.ts
. Die meisten Deklarationstypen für npm-Module sind bereits geschrieben und können mit verwendet werdennpm install @types/module_name
(wobei module_name der Name des Moduls ist, dessen Typen Sie einschließen möchten).Es gibt jedoch Module, deren Typdefinitionen nicht vorhanden sind. Um den Fehler zu beheben und das Modul mithilfe von zu importieren
import * as module_name from 'module-name'
, erstellen Sie einen Ordnertypings
im Stammverzeichnis Ihres Projekts, erstellen Sie einen neuen Ordner mit Ihrem Modulnamen und darin Ordner einemodule_name.d.ts
Datei erstellen und schreibendeclare module 'module_name'
. Gehen Sie danach einfach zu Ihrertsconfig.json
Datei und fügen Sie"typeRoots": [ "../../typings", "../../node_modules/@types"]
das hinzucompilerOptions
(mit dem richtigen relativen Pfad zu Ihren Ordnern), um TypeScript mitzuteilen, wo es die Typdefinitionen Ihrer Bibliotheken und Module finden kann, und fügen Sie"exclude": ["../../node_modules", "../../typings"]
der Datei eine neue Eigenschaft hinzu . Hier ist ein Beispiel, wie Ihre tsconfig.json-Datei aussehen sollte:Auf diese Weise wird der Fehler behoben und Sie können sich an die neuesten ES6- und TypeScript-Regeln halten.
quelle
index.d.ts
. Davon abgesehen war dies die einzige Lösung, die für mich rundum funktionierte.Versuchen Sie für alle anderen, die dies lesen, Ihre .js-Datei in .ts umzubenennen
Bearbeiten: Sie können auch
"allowJs": true
zu Ihrer tsconfig-Datei hinzufügen .quelle
Dieser Weg funktioniert bei mir:
1. Fügen Sie Ihre eigene Deklaration in eine Deklarationsdatei wie index.d.ts ein (möglicherweise unter dem Projektstamm). 2. Fügen Sie Ihre index.d.ts zu tsconfig.json hinzu- edit: benötigte Anführungszeichen um den Modulnamen
quelle
Ich hatte das gleiche Problem bei der Verwendung eines Knotenmoduls mit einer in Typoskript geschriebenen Reaktionsanwendung. Das Modul wurde erfolgreich mit installiert
npm i --save my-module
. Es ist in Javascript geschrieben und exportiert eineClient
Klasse.Mit:
Die Kompilierung schlägt mit dem Fehler fehl:
@types/my-module
existiert nicht, daher habe ichmy-module.d.ts
neben der Datei, in diemy-module
importiert wird, eine Datei mit der vorgeschlagenen Zeile hinzugefügt . Ich habe dann den Fehler bekommen:Der Client wird tatsächlich exportiert und funktioniert normal, wenn ich ihn in einer js-App verwende. Außerdem sagt mir die vorherige Nachricht, dass der Compiler in der richtigen Datei sucht (
/node_modules/my-module/lib/index.js
wird immy-module/package.json
"main"
Element definiert ).Ich habe das Problem gelöst, indem ich dem Compiler mitgeteilt habe
any
, dass implizite Dinge mir egal sind, dh ich habefalse
die folgende Zeile dertsconfig.json
Datei festgelegt:quelle
Einfach zu beheben ist:
Wenn Sie die Schnittstelle des Objekts deklarieren möchten (Empfehlung für großes Projekt), können Sie Folgendes verwenden:
Wie benutzt man das? einfach..
quelle
Ich bekam das auch, hatte mich eine Weile verwirrt, selbst wenn das Modul und die Typen bereits installiert waren und meine IDE mehrmals neu geladen wurden.
In meinem Fall wurde das Problem behoben, indem Terminalprozesse beendet, entfernt
node_modules
, der Cache des Node Package Managers geleert undinstall
der Editor neu geladen wurde.quelle
Leider liegt es nicht in unserer Hand, ob der Paketschreiber mit einer Deklarationsdatei stört. Ich neige dazu, eine Datei zu haben
index.d.ts
, die alle fehlenden Deklarationsdateien aus verschiedenen Paketen enthält:Index.ts:
quelle
Das hat bei mir funktioniert.
npm install --save readline
quelle
Ich habe hier alles versucht, aber für mich war es ein ganz anderes Problem: Ich musste
*.d.ts
alle Importanweisungen entfernen :Nach dem Entfernen des Fehlers ging weg ...
Erläuterung : Wenn wir ein Modul in einer
*.d.ts
Datei deklarieren , wird es vom Typescript-Compiler automatisch als Umgebungsmodul übernommen (das Sie nicht explizit importieren müssen). Sobald wir das angegeben habenimport ... from ...
, wird die Datei nun zu einem normalen (ES6) Modul und wird daher nicht automatisch aufgenommen. Wenn Sie also weiterhin möchten, dass es sich wie ein Umgebungsmodul verhält , verwenden Sie einen anderen Importstil wie folgt :quelle
Sie können es einfach mit dem folgenden Code importieren:
quelle