Typoskript: Wie kann ein Modul "gefunden" werden, aber nicht behoben ist? Was hat das zu tun mit 'noResolution'?

Wenn ich mit tsc in der 'proj' Verzeichnis mit --traceResolution, sehe ich das Modul 'foo' ist "erfolgreich gelöst", aber nicht "gefunden":

======== Module name 'foo' was successfully resolved to 'C:/dev/ts-options/typings/foo/index.d.ts'. ========

main.ts(1,18): error TS2307: Cannot find module 'foo'.

Einstellung "noResolve": true in tsconfig.Compiler-Optionen macht die Fehler Weg. Aber ich bin supr-verwirrt!

Frage 1: Was ist der Unterschied zwischen "Auflösung" und "finden"? Ich dachte, diese waren Synonyme

Frage 2: Warum ist 'noResolve' beeinflussen dieses Verhalten? Was bedeutet noResolve eigentlich tun? TS compiler-Optionen docs sagen "nicht hinzufügen dreifach-slash Hinweise oder Modul importieren Ziele, um die Liste der zusammengestellten Dateien." aber ich weiß nicht, was das bedeutet.

Mit diesem Verzeichnis Struktur

  • /c/dev/ts-Optionen/
    • Testungen/
      • foo
        • index.d....ts
    • proj dies ist, wo ich bin mit tsc
      • tsconfig.json
      • main.ts

proj/tsconfig.json (problem behoben ist, wenn ich eine änderung noResolve auf false):

{
    "compilerOptions": {
        "baseUrl": ".",
        "types": [],
        "outDir": "../out",
        "paths": {
            "foo": [
                "../typings/foo"
            ],
        },
        "noResolve": true
    },
    "include": [
        "**/*.ts",
    ],
    "exclude": [
        "node_modules"
    ]
}

proj/main.ts:

import foo from "foo"

Testungen/foo/index.d....ts:

declare function foo(num: number): number;
export default foo;

Update

Zwei Lösungen:

  • Set noResolve: false
  • ODER "../Testungen", um die "zählen" - Abschnitt in der tsconfig

Meine Vermutung ist, dass es ist ein Konzept einer "compilation unit", so dass:

  • mit noResolve: false und dann die compilation-unit kann dynamisch wachsen als TS folgt imports.

  • Mit noResolve: true, dann ist die compilation unit befestigt ist so etwas wie tsconfig.baseUrl/** + (tsconfig.include - tsconfi.exclude) .

  • Wenn Sie eine Datei außerhalb des compilation unit dann im TS kann 'beheben' ein import (finden Sie heraus den Pfad zu einem .d....ts/.ts/.tsx-Datei) aber nicht 'finden' es (eigentlich die Datei Lesen).

Diese immer noch nicht wirklich Sinn für mich, obwohl. Was ist der Sinn von 'auflösen' auf eine Lage man kennt, werden nicht in der Lage zu 'finden'?

1 Antworten

  • J. Koutsoumpas
    1. Mai 2019

    Die Ursache für dieses Problem ist eine falsch benannte Weg in die paths option tsconfig.json. Definieren Sie einen Pfad mit dem Namen foo um den Punkt "../Testungen/foo" relativ zum Projekt-Stammverzeichnis, aber das ist nicht richtig, weil, wie es übersetzt zu einem nicht existierenden Pfad:

    Vorausgesetzt, die proj - Verzeichnis ist:

    C:/dev/ts-options

    dann zusammen mit dem angegebenen foo Pfad erweitert:

    C:/dev/ts-options/../typings/foo

    die Ergebnisse in den nicht existierenden Pfad:

    C:/dev/rp-build/node/rp-cli/test/fixtures/src/typescript/typings/foo.

    Die Lösung findet Sie schließlich, indem Sie unten alle Verzeichnisse, aber die import verwendet foo benannte Weg, der übersetzt wird, zu den oben falsch vollständigen Pfad.

    Es gibt also zwei Lösungen, entweder Sie korrigieren die foo path-definition in die tsconfig.json, oder verwenden Sie einen relativen Pfad zu der main.ts von " foo " /index.d....ts in import - Anweisung wie folgt aus:

    import foo from "../../../whatever/typings/foo"