2016-01-02 22 views
5

Ich habe ein lokales Knotenpaket geschrieben in TypeScript, das ich in meinem aktuellen Projekt verwenden möchte. Mit NPM kann ich lokale Pakete wie folgt installieren:tsd: lokale Definitionsdatei installieren

$ npm install --save /path/to/package 

Oder:

$ npm install --save /path/to/package.tar.gz 

Dies installiert die erforderlichen Js-Dateien im Verzeichnis node_modules. Es gibt auch eine generierte .d.ts-Datei in diesem Paket, die ich in meinem Projekt installieren möchte (automatisch in typings/tsd.d.ts verlinken). Aber mit dem folgenden Befehl hat keine Auswirkung:

$ tsd install /path/to/package/package.d.ts --save 

Es sagt >> zero results. Also, wie kann man lokale Definitionsdateien installieren, ohne ein Repository zu benötigen?

UPDATE:

kann ich einfach meine d.ts Kopieren Sie die Datei in das Verzeichnis Typisierungen und mein Texteditor (für mich ist es Sublime Text mit dem Typoskript Plugin) es ist in der Lage, die Erklärung zu finden. Die Verzeichnisstruktur ist so etwas wie diese:

/my-project/ 
    /typings/ 
    tsd.d.ts - auto-generated by `tsd install` 
    node/ - I've installed the node definitions 
    my-package.d.ts - copied or symlinked file 
    my-project.ts - I'm working here 

Jedoch habe ich ein Problem habe, wenn die einzige Funktion in module.exports (exports = function... in Typoskript) exportieren. In diesem Fall ist die exportierte Funktion irgendwie "anonymous" und wird nicht einmal in der d.ts Datei benannt, also muss ich sie manuell bearbeiten.

Mein Testfall:

'my-Paket' bietet eine einzige Funktion, in der Regel als 'myPackage' importiert:

export = function myPackage(a: string, b: string) { return a + ' ' + b; }; 

declaration zu true in tsconfig.json gesetzt, so dass der tsc Befehl erzeugt eine my-package.d.ts Datei:

declare var _default: (a: string, b: string) => string; 
export = _default; 

Mein Paket soll in meinem Projekt wie folgt verwendet werden:

import myPackage = require('my-package'); 
myPackage('foo', 'bar'); 

jedoch tsc nicht myPackage finden, obwohl my-package.d.ts in den Typisierungen Ordner kopiert wurde. Ich brauche diese Datei zu bearbeiten, so dass es wie folgt aussieht:

declare var myPackage: (a: string, b: string) => string; 
//export = _default; - not needed 

Oder noch besser für eine korrekte Funktion require():

declare module 'my-package' /* this is the string passed to require() */ { 
    export = function(a: string, b: string): string; 
} 
+1

die d.ts Dateien aus dem node_modules importieren (ich nur dort eine Datei kopiert) scheint für mich ganz gut zu arbeiten, gibt es keine Notwendigkeit für tsd nichts zu tun. – toskv

+0

Sie haben Recht, toskv, ich kann einfach die d.ts-Datei kopieren, ohne sie in typings/tsd.d.ts referenzieren zu müssen. Ich habe ein Problem festgestellt, wenn ich die exports-Variable gesetzt habe. Ich habe meinen Post mit weiteren Informationen aktualisiert. – Simon

Antwort

5

In Ihrem lokalen Knoten Paket, fügen Sie einen typescript > definition Eintrag in package.json:

Führen Sie nach der Installation des Pakets in Ihrem Projekt den Befehl ...

aus
tsd link 

... die einen Verweis auf package.d.ts in Ihrem Projekt tsd.d.ts Datei (reference) hinzufügen wird.


Auch auf der Grundlage Ihrer bearbeiten, würde ich vorschlagen, dass Sie Ihre Definitionsdatei so zu etwas ändern (man beachte die Anführungszeichen my-package):

declare module "my-package" { 
    function myPackage(a: string, b: string): string; 
    export = myPackage; 
} 

Das wird es mit dem folgenden Code funktioniert :

import myPackage = require('my-package'); 
myPackage('foo', 'bar'); 
+0

danke, es hat funktioniert! Meine TypeScript-Quelle (mit Typings) befindet sich jedoch in einem separaten Verzeichnis von dem kompilierten JavaScript (mit package.json und node_modules), gibt es eine Möglichkeit, es auch hier zum Laufen zu bringen? – Simon

+0

@Simon Ich bin mir nicht sicher, was du meinst. Mit diesem Setup müssen Sie nur sicherstellen, dass die Definitionsdatei des Pakets im Paket enthalten ist (Sie müssen die Typoskriptquelle des Pakets nicht mit einbeziehen). Dies fügt etwas wie '/// ' zu '~/typings/tsd.d.ts' in Ihrer Anwendung hinzu . Solange diese Definitionsdatei alle notwendigen Informationen enthält, sollte sie an diesem Punkt gut zusammengestellt sein. Übrigens, basierend auf Ihrer Bearbeitung, sehen Sie meine Bearbeitung über das Ändern der Definitionsdatei ... Ich weiß, wie ich hier arbeite. –

+0

Ich bin mir nicht sicher, ob ich Ihren Standpunkt verstehe oder Sie meinen Standpunkt hier nicht verstehen. Die letzte Bearbeitung mit 'declare module ...' zu machen und einfach die d.ts-Datei in den Typings-Ordner meines Projekts zu kopieren funktioniert jetzt einwandfrei! – Simon

1

ab Typoskript 1.6 Sie Ihre Typ-Definitionsdatei verweisen können von Ihnen package.json und Modul Auflösung des Typoskript sollte graben können, die Typdefinition.

Fügen Sie in Ihrer package.json-Datei (Ihres lokalen npm-Moduls) einen Eintrag "typings" hinzu, z.

{ 
    "name": "my-package", 
    "typings": "./relative/path/to/my-package.d.ts" 
} 

Auf diese Weise müssen Sie nicht mit TSD überhaupt geigen.

See Typoskript Wiki: https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages

8

Auch wenn der Trick mit package.json funktioniert, ich lieber die aus Tools für die (tsd oder Typisierungen).

Ich habe gerade die Antwort für Typisierungen:
typings install --save --ambient file:./node_modules/.../file.d.ts

Ich denke, es ist das gleiche mit tsd :)

EDIT:
Da Typoskript 2.0 Typisierungen nutzlos ist.
Führen Sie einfach npm i --save-dev @types/some-library

+2

--ambiente wird jetzt durch --global ersetzt (getestet an v1.3.2) – angularsen

+2

Was ist das für TypeScript 2s neuer Ansatz zum Erfassen von Typdefinitionsdateien ('npm install @types/...')? Sie können 'types install file: ...' installieren, um eine einzelne Typdefinitionsdatei zu installieren, aber Sie können nur 'npm' ein Paket installieren. – danvk

+0

@danvk Ich habe meinen Beitrag bearbeitet – Maxime

Verwandte Themen