2015-07-27 34 views
5

Biorąc pod uwagę te pliki 2 maszynopisautomatyczne generowanie deklaracji modułu otoczenia

api/Token.ts

interface Token { 
    code: string 
} 
export default Token 

i index.ts

export * from './api/Token' 

TSC 1.5 z przełącznikiem --declarations wygeneruje dwa .d.ts plików (o podobnej treści)

api/Token.d.ts

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

i index.d.ts

export * from './api/Token'; 

Running grunt-DTS-pakiet z następującymi opcjami

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

wygeneruje deklaracji plik modułu otoczenia my-module.d.ts o następującej treści

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

Jednak ta deklaracja nie skompilować ze względu na: Import or export declaration in an ambient module declaration cannot reference module through relative module name.

Jak ja automatycznie generowania deklaracji modułu otoczenia dla dwojga pliki maszynopisu powyżej?

EDIT

Proszę śledzić najnowsze informacje dotyczące https://github.com/Microsoft/TypeScript/issues/2262

Odpowiedz

3

I niedawno napisał blog post na ten temat. Podsumowując, można użyć autodts jeśli zastąpić index.ts z api.ts, zawierające następujące informacje:

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

Upewnij api.ts jest w tym samym miejscu co katalog api (obok, nie w środku).

Następnie trzeba package.json plik:

{ 
    "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" 
    } 
} 

ważne jest, że nazwa pakietu api dopasowuje plik api.ts i katalog api. W ten sposób zarówno Node.js, jak i kompilator TypeScript będą wyglądały w tych samych miejscach, gdy używasz pakietu.

Wreszcie, trzeba tsconfig.json plik:

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

Teraz npm install zostanie skompilowany pakiet i produkować dołączonego index.d.ts plik zdefiniowany w ustawieniach definition w package.json.

Aby korzystać z pakietu, można zrobić coś takiego:

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

import {Token} from 'api'; 

class foo { 
    key: Token; 
} 

Można użyć autodts link zachować reference path na bieżąco, sprawdź blogu i/lub autodts Dokumenty na to.

Powstały index.d.ts zawiera:

/// <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 i api.js są puste.

+0

Dziękuję za szczegółową odpowiedź i przepraszam za późną odpowiedź, czekałem na test TypeScript 1.6, który całkowicie zmienia umowę. Twoje rozwiązanie to sposób na TypeScript <1.6. W przypadku TypeScript 1.6 w tym wydaniu GitHub są pewne szczegóły: https://github.com/Microsoft/TypeScript/issues/247 –

+0

@BrunoGrieder https://github.com/Microsoft/TypeScript/wiki/Typings- for-npm Pakiety są naprawdę niejasne. Czytałem strony na stronach komentarzy dotyczących zagadnień github, ale nie mogę znaleźć odpowiedzi na to naprawdę proste pytanie. W przypadku maszynopisu> 1.6, na przykład, chcesz napisać bibliotekę, która korzysta z modułu "inversify" (wpisana), a następnie chcesz również użyć funkcji inversify poza biblioteką. Jak to osiągnąć? – David

+0

@ David Nie używałam nigdy inwersji, ale możesz znaleźć bibliotekę zestawu [tutaj] (http://github.com/wadahiro/typescript-library-boilerplate) i kilka szczegółów, które napisałem [tam] (http://stackoverflow.com/questions/34221594/best-to-share-a-js-object-between-a-maszynopis-frontend-and-nodejs-backend/34225037 # 34225037) i nieco podobne pod spodem [tam] (http://stackoverflow.com/questions/35582275/using-an-external-typescript-library-within-a-typescript-internal-module/35588095#35588095) –

Powiązane problemy