2016-07-29 11 views
0

Ich habe eine SPA-Anwendung in Visual Studio, die in TypeScript (2.0) geschrieben ist und Aurelia verwendet. Aber meine Probleme sind nicht spezifisch für Aurelia oder VS.Verweisen/Importieren von Klassen aus Typings/anderen Projekten

Jetzt möchte ich Plugins für diese Anwendung in einem anderen Projekt schreiben. Diese Plugins müssen Klassen/Module aus der Hauptanwendung beziehen/importieren.

Dies funktioniert grundsätzlich, aber das Plugin-Projekt weiß nicht über die Klassen/Module aus der Hauptanwendung. Deshalb, obwohl Dinge kompilieren und korrekt laufen (dank JavaScript), beschwert sich die IDE (Visual Studio, VS Code oder der NPM-Typskript-Compiler) Kann Modul 'abc' auf keinem Import finden. Dies bedeutet auch, dass für diese Klassen keine Intellisense- oder Auto-Vervollständigen-Unterstützung vorhanden ist.

Ich habe keine Deklarationen (*.d.ts) im Hauptprojekt erstellt und eine Build-Aufgabe erstellt, um diese in das Plugin-Projekt zu kopieren. Aber sie werden immer noch nicht erkannt. Wie kann ich das Plugin-Projekt erkennen, dass diese Klassen aus Deklarationsdateien stammen?

Die Haupt-App hat eine Klasse wie core/events.ts. Seine DTS könnte wie folgt aussehen:

export declare class Events { 
    static MY_CONSTANT: string; 
} 

Das Plugin-Projekt hat ein Plugin hier: Plugins/PluginA/Plugin-panel.ts. Es mag Events von Kern/events.ts importieren:

import { Events as e1 } from 'core/events'; 
import { Events as e2 } from 'typings/core/events'; 

Die erste Zeile (e1) ist wie ich Events im Hauptprojekt importieren würde und es tatsächlich funktioniert, wenn die kompilierte JavaScript-Datei gelöscht wird in die Anwendung. Aber der Compiler beklagt sich darüber (semantischer Fehler).

Die zweite Zeile (e2) hat keine Compiler-Warnung, ist aber in Laufzeit falsch.

Die Typisierungen wurden Plugins/Typisierungen kopiert/, hier Plugins/Typisierungen/core/events.d.ts. Nur der Ordner Plugins enthält TypeScript-Dateien, der Rest des Projekts ist C#. Es gibt ein tsconfig.json im Stammordner, die von Interesse sein werden, ich denke:

{ 
    "version": "2.0.0", 
    "compileOnSave": false, 
    "compilerOptions": { 
    "rootDir": "./", 
    "sourceMap": true, 
    "target": "es6", 
    "module": "amd", 
    "declaration": false, 
    "noImplicitAny": false, 
    "noResolve": true, 
    "removeComments": true, 
    "noLib": false, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true 
    }, 
    "filesGlob": [ 
    "./Plugins/**/*.ts", 
    "./Plugins/typings/**/*.d.ts" 
    ], 
    "exclude": [ 
    "node_modules" 
    ], 
    "atom": { 
    "rewriteTsconfig": false 
    } 
} 

Ich habe bereits versucht rootDir zu ./Plugins zu setzen, aber das hat auch nicht geholfen.

Wie kann ich das Projekt so einrichten, dass die Import-Anweisung in der Plugin-Entwicklung gleich funktioniert und in der Anwendung bereitgestellt wird?

Hinweis: Wenn ich eine Zuordnung für den Import in die Hauptanwendung Loader-Konfiguration hinzuzufügen (die config.js für SystemJS ist ich hier verwende, sieht die Zeile wie folgt: "typings/core/events": "core/events",), der Hauptanwendung kann mit den verschiedenen Importpfad arbeiten . Aber das würde bedeuten, dass ich für jede Typoskript-Datei im Hauptprojekt ein Mapping einrichten müsste.

Antwort

1

Bei der Suche nach einem anderen import Problem habe ich diese Frage gefunden: Absolute module path resolution in TypeScript files in VSCode. Beachten Sie, dass ich mich mit der Antwort von Lekhnath verbinde.

Scheinbar TypeScript 2.0 hat eine neue baseUrl Compiler-Option, die die Auflösung Basispfade für Module mit relativen Pfad setzt!

So kann ich Module/Klassen von meinen Typisierungen löst meinen durch Zugabe compilerOptions:

"baseUrl": "./Plugins/typings/" 

Der in Visual Studio arbeitet, die Befehlszeilen-Compiler und VS-Code (beachten Sie, dass VS-Code eine Konfigurationseinstellung muss Verwenden Sie den lokalen Typescript-Compiler des Projekts.

Verwandte Themen