2015-07-27 11 views
5

Angesichts dieser 2 Maschinenschrift Dateienautomatischen Erzeugen von Umgebungsmodul Erklärungen

api/Token.ts

interface Token { 
    code: string 
} 
export default Token 

und index.ts

export * from './api/Token' 

tsc 1.5 mit dem --declarations Schalter erzeugen zwei .d.ts Dateien (mit ähnlichem Inhalt)

api/Token.d.ts

interface Token { 
    code: string; 
} 
export default Token; 

und index.d.ts

export * from './api/Token'; 

Lauf Grunzen-dts-Bündel mit den folgenden Optionen

dts_bundle: { 
     release: { 
      options: { 
       name: 'my-module', 
       main: 'index.d.ts' 
      } 
     } 
    } 

wird eine Umgebungsmodul Deklarationsdatei my-module.d.ts mit folgendem Inhalt

declare module 'my-module' { 
    export * from './api/Token'; 
} 

jedoch diese Erklärung nicht kompilieren aufgrund erzeugen: Import or export declaration in an ambient module declaration cannot reference module through relative module name.

Wie kann ich automatisch eine Umgebungsmoduldeklaration für die beiden erzeugen Typoskript-Dateien oben?

EDIT

Bitte folgen neuesten Updates auf https://github.com/Microsoft/TypeScript/issues/2262

Antwort

3

Ich habe ein blog post über dieses vor kurzem geschrieben. Zusammenfassend kann man autodts verwenden, wenn Sie index.ts mit api.ts ersetzen, mit folgendem Inhalt:

export {default as Token} from './api/Token'; 

Stellen Sie sicher, api.ts ist an der gleichen Stelle wie das api Verzeichnis (neben, nicht drin).

Dann benötigen Sie eine package.json Datei:

{ 
    "name": "api", 
    "version": "1.0.0", 
    "main": "dist/api.js", 
    "scripts": { 
    "preinstall": "npm install autodts", 
    "postinstall": "autodts link", 
    "prepublish": "tsc && autodts generate" 
    }, 
    "typescript": { 
    "definition": "index.d.ts" 
    }, 
    "dependencies": { 
    "autodts": "~0.0.4" 
    }, 
    "devDependencies": { 
    "@lib/autodts-generator": "~0.0.1", 
    "typescript": "~1.5.3" 
    } 
} 

Es ist wichtig, dass der Paketname api entspricht die Datei api.ts und Verzeichnis api. Auf diese Weise sehen sowohl Node.js als auch der TypeScript-Compiler an den gleichen Stellen aus, wenn Sie Ihr Paket verwenden.

Schließlich müssen Sie eine tsconfig.json Datei:

{ 
    "compilerOptions": { 
     "declaration": true, 
     "module": "CommonJS", 
     "target": "es5", 
     "outDir": "dist" 
    }, 
    "files": [ 
     "api.ts" 
    ] 
} 

Jetzt npm install Ihr Paket zusammenzustellen und um eine gebündelte index.d.ts Datei zu erzeugen, wie es in der definition Einstellung in package.json definiert.

Ihr Paket verwenden kann, so etwas wie tun: können

/// <reference path = "api/index.d.ts" /> 

import {Token} from 'api'; 

class foo { 
    key: Token; 
} 

Sie autodts link verwenden, um die reference path auf dem neuesten Stand zu halten, überprüfen Sie die Blog-Post und/oder autodts docs dafür.

Das resultierende index.d.ts enthält:

/// <reference path="index.ref.d.ts" /> 
declare module 'api/Token' { 
    interface Token { 
     code: string; 
    } 
    export default Token; 

} 
declare module 'api' { 
    export { default as Token } from 'api/Token'; 

} 

index.ref.d.ts und api.js leer sind.

+0

Vielen Dank für die ausführliche Antwort und meine Entschuldigung für die späte Antwort, ich warte auf TypScript 1.6 zu testen, die den Deal vollständig ändert. Ihre Lösung ist der Weg für TypeScript <1.6. Für TypeScript 1.6 gibt es einige Details in diesem GitHub-Problem: https://github.com/Microsoft/TypeScript/issues/247 –

+0

@BrunoGrieder https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm -Pakete ist wirklich unklar. Ich habe Seiten auf Seiten mit Kommentaren zu GitHub-Problemen gelesen, kann aber keine Antwort auf diese wirklich einfache Frage finden. Wenn Sie beispielsweise mit typescript> 1.6 eine Bibliothek schreiben möchten, die das Modul "inversify" (typisiert) verwendet, möchten Sie auch inversify außerhalb der Bibliothek verwenden. Wie erreichst du das? – David

+0

@David Ich habe nie inversify verwendet, aber Sie können eine Textbaustein-Bibliothek finden [http://github.com/wadahiro/typescript-library-boilerplate] und einige Details, die ich [dort] schrieb (http://stackoverflow.com)/questions/34221594/best-way-to-share-a-js-objekt-zwischen-a-typescript-frontend-und-nodejs-backend/34225037 # 34225037) und etwas ähnlich am unteren [dort] (http://stackoverflow.com/questions/35582275/using-an-external-typescript-library-within-a-typescript-internal-module/35588095#35588095) –