wake-up-neo.com

Es wurde keine Deklarationsdatei für das Modul 'Modulname' gefunden. '/path/to/module-name.js' hat implizit den Typ 'any'

Ich habe gelesen, wie TypeScript Modulauflösung funktioniert.

Ich habe das folgende Repository: ts-di ..__ Nach dem Kompilieren sieht die Verzeichnisstruktur folgendermaßen aus:

├── 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 meinem package.json habe ich "main": "dist/index.js" geschrieben.

In Node.js funktioniert alles gut, aber TypeScript:

import {Injector} from 'ts-di';

Es wurde keine Deklarationsdatei für das Modul 'ts-di' gefunden. '/path/to/node_modules/ts-di/dist/index.js' hat implizit den Typ 'any'.

Und doch, wenn ich wie folgt importiere, funktioniert alles:

import {Injector} from '/path/to/node_modules/ts-di/dist/index.js';

Was mache ich falsch?

99
ktretyak

Dieses Gefühl, wenn Sie zwei Tage nach draußen schauen und es so finden: Entfernen Sie einfach .js aus "main": "dist/index.js" in package.json und alles funktioniert gut!

"main": "dist/index",

UPD: diese Antwort relativ, wenn Sie ein eigenes npm-Paket haben, wenn nicht - siehe meine Antwort unten .

Und wenn die obige Antwort nicht gelöst wurde, importieren Sie Ihr Modul. Fügen Sie einfach typings in package.json hinzu:

"main": "dist/index",
"typings": "dist/index",

Natürlich ist hier der Ordner dist - dort werden die Dateien Ihres Moduls gespeichert.

66
ktretyak

Zwei weitere Möglichkeiten, wenn ein Modul nicht bei Ihnen ist - installieren Sie es einfach von @types:

npm install -D @types/module-name

Oder, falls die Installation fehlerhaft ist - versuchen Sie, import in require umzuschreiben:

// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');
140
ktretyak

Wenn Sie ein Drittanbieter-Modul 'foo' importieren, das weder in der Bibliothek selbst noch im @types/foo-Paket (das aus dem DefinitelyTyped -repository generiert wurde) keine Typisierung bereitstellt, können Sie diesen Fehler beheben indem Sie das Modul in einer .d.ts-Datei deklarieren:

// foo.d.ts
declare module 'foo';

Wenn Sie dann foo importieren, wird dies einfach als any eingegeben. 


Alternativ, wenn Sie Ihre eigenen Typisierungen rollen möchten, können Sie dies auch tun:

// foo.d.ts
declare module 'foo' {
    export function getRandomNumber(): number
} 

Dann wird dies korrekt kompiliert:

import { getRandomNumber } from 'foo';
const x = getRandomNumber(); // x is inferred as number

Sie müssen keine vollständigen Typisierungen für das Modul angeben, sondern nur für die Bits, die Sie tatsächlich verwenden (und die korrekte Typisierungen wünschen). Dies ist besonders einfach, wenn Sie eine relativ kleine Menge API verwenden.


Wenn Sie sich jedoch nicht für die Typisierung externer Bibliotheken interessieren und möchten, dass alle Bibliotheken ohne Typisierung als any importiert werden, können Sie dies einer .d.ts-Datei hinzufügen:

declare module '*';

Der Vorteil (und der Nachteil) ist, dass Sie absolut alles importieren können und TS kompilieren wird.

64
Retsam

TypeScript implementiert im Wesentlichen Regeln und fügt Typen in Ihren Code ein, um ihn klarer und genauer zu machen, da Javascript keine Einschränkungen enthält. Für 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, sich außerhalb Ihres Gültigkeitsbereichs befinden oder versuchen, einen anderen Typ zurückzugeben. Wenn Sie also externe Bibliotheken und Module mit TypeScript verwenden, müssen diese Dateien enthalten die die Typen in diesem Code beschreiben. Diese Dateien heißen type-Deklarationsdateien mit der Erweiterung d.ts. Die meisten Deklarationstypen für npm-Module sind bereits geschrieben, und Sie können sie mit npm install @types/module_name einschließen (wobei Modulname der Name des Moduls ist, dessen Typen Sie einschließen möchten). 

Es gibt jedoch Module, für die es keine Typdefinitionen gibt. Um den Fehler zu beseitigen und das Modul mithilfe von import * as module_name from 'module-name' zu importieren, erstellen Sie einen Ordner typings im Stammverzeichnis Ihres Projekts, und erstellen Sie einen neuen Ordner mit Ihrem Modulnamen und Erstellen Sie in diesem Ordner eine module_name.d.ts-Datei und schreiben Sie declare module 'module_name'. Gehen Sie anschließend zu Ihrer tsconfig.json-Datei und fügen Sie "typeRoots": [ "../../typings", "../../node_modules/@types"] in der compilerOptions (mit dem richtigen relativen Pfad zu Ihren Ordnern) hinzu, damit TypeScript wissen kann, wo es die Typdefinitionen Ihrer Bibliotheken und Module finden kann und der Datei eine neue Eigenschaft "exclude": ["../../node_modules", "../../typings"] hinzufügen kann. Hier ein Beispiel, wie Ihre Datei tsconfig.json aussehen sollte:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true,
        "outDir": "../dst/",
        "target": "ESNEXT",
        "typeRoots": [
            "../../typings",
            "../../node_modules/@types"
        ]
    },
    "lib": [
            "es2016"
    ],
    "exclude": [
        "../../node_modules",
        "../../typings"
    ]
}

Dadurch wird der Fehler behoben und Sie können sich an die neuesten ES6- und TypeScript-Regeln halten.

14
Marko Rochevski

Wenn Sie eine schnelle Lösung benötigen, fügen Sie diese einfach vor dem Import hinzu:

// @ts-ignore
4
Liran H

Das gleiche Problem hatte ich bei der Verwendung eines Knotenmoduls mit einer in TypeScript geschriebenen Reaktanwendung. Das Modul wurde erfolgreich mit npm i --save my-module..__ installiert. Es ist in Javascript geschrieben und exportiert eine Client-Klasse.

Mit:

import * as MyModule from 'my-module';
let client: MyModule.Client = new MyModule.Client();

Die Kompilierung schlägt mit dem Fehler fehl:

Could not find a declaration file for module 'my-module'. 
'[...]/node_modules/my-module/lib/index.js' implicitly has an 'any' type.
  Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module 'my-module';`

Da @types/my-module nicht vorhanden ist, habe ich neben der Datei, in der my-module.d.ts importiert wird, eine my-module-Datei mit der vorgeschlagenen Zeile hinzugefügt. Ich habe dann den Fehler bekommen:

Namespace '"my-module"' has no exported member 'Client'.

Der Client wird tatsächlich exportiert und funktioniert normal, wenn ich ihn in einer js-App verwende. In der vorherigen Nachricht wird außerdem angezeigt, dass der Compiler in der richtigen Datei sucht (/node_modules/my-module/lib/index.js ist in my-module/package.json"main"-Element definiert). 

Ich löste das Problem, indem ich dem Compiler mitteilte, dass mir implizite any egal ist, das heißt, ich habe die folgende Zeile der tsconfig.json-Datei auf false gesetzt:

    "noImplicitAny": false,
2
Kanthavel

Dieser Weg funktioniert für mich:

declare module Injector;
  {
    "compilerOptions": {
        "strictNullChecks": true,
        "moduleResolution": "node",
        "jsx": "react",
        "noUnusedParameters": true,
        "noUnusedLocals": true,
        "allowSyntheticDefaultImports":true,
        "target": "es5",
        "module": "ES2015",
        "declaration": true,
        "outDir": "./lib",
        "noImplicitAny": true,
        "importHelpers": true
      },
      "include": [
        "src/**/*",
        "index.d.ts",   // declaration file path
      ],
      "compileOnSave": false
    }
0
Lumaskcete
npm install --save TypeScript @types/node @types/react @types/react-dom @types/jest

oder

yarn add TypeScript @types/node @types/react @types/react-dom @types/jest
0
Bongi Looks

Ich bekam das auch, hatte mich für eine Weile ratlos gemacht, obwohl das Modul und die Typen bereits installiert waren und meine IDE mehrmals neu geladen wurden.

Was in meinem Fall behoben wurde, war das Beenden von Terminalprozessen, das Entfernen von node_modules, das Löschen des Cache-Pakets des Knotenpakets, das Ausführen einer neuen install und das erneute Laden des Editors.

0
Leo

Ich importierte Button von React-Native-Button und es gab diesen Fehler wie im Bild gezeigt: enter image description here

Ich mache den Trick. Ich ging in den Ordner node_modules/react-native-button/und kopierte den Inhalt der Datei Button.js. Erstellen Sie eine neue Datei mit dem Namen Button.d.ts und fügen Sie den Inhalt ein. Gespeichert und der Fehler war weg! Ich kenne den Grund nicht, aber jetzt ist es weg!

0
Ali Yar Khan