2015-07-27 14 views
5

Dato questi file 2 dattiloscrittogenerano automaticamente le dichiarazioni di modulo ambientali

api/Token.ts

interface Token { 
    code: string 
} 
export default Token 

e index.ts

export * from './api/Token' 

TSC 1.5 con l'interruttore --declarations genererà due .d.ts files (con contenuti simili)

api/Token.d.ts

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

e index.d.ts

export * from './api/Token'; 

Esecuzione grugnito-DTS-fascio con le seguenti opzioni

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

genererà un file di dichiarazione del modulo ambiente my-module.d.ts con il seguente contenuto

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

Tuttavia questa dichiarazione non compila a causa di: Import or export declaration in an ambient module declaration cannot reference module through relative module name.

Come posso automaticamente generare una dichiarazione del modulo ambiente per i due file dattiloscritto sopra?

EDIT

Si prega di seguire gli ultimi aggiornamenti sulla https://github.com/Microsoft/TypeScript/issues/2262

risposta

3

Recentemente ho scritto un blog post su questo. Per riassumere, si può usare autodts se si sostituisce index.ts con api.ts, contenente le seguenti:

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

Assicurarsi api.ts è nello stesso luogo come directory api (accanto, non dentro di esso).

allora avete bisogno di un file package.json:

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

E 'importante che il nome del pacchetto api corrisponde il file e la directory api.tsapi. In questo modo sia Node.js che il compilatore TypeScript guarderanno nello stesso posto quando usano il tuo pacchetto.

Infine, è necessario un file tsconfig.json:

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

Ora npm install sarà compilare il pacchetto e produrre un file di index.d.ts in bundle come definito nell'impostazione definition in package.json.

Per utilizzare il pacchetto, è possibile fare qualcosa di simile:

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

import {Token} from 'api'; 

class foo { 
    key: Token; 
} 

È possibile utilizzare autodts link per mantenere il reference path fino ad oggi, controllare il post sul blog e/o autodts docs per questo.

La risultante index.d.ts contiene:

/// <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 e api.js sono vuote.

+0

Grazie per la risposta dettagliata e le mie scuse per la risposta in ritardo, stavo aspettando di testare TypeScript 1.6 che cambia completamente l'accordo. La tua soluzione è la strada da percorrere per TypeScript <1.6. Per TypeScript 1.6, ci sono alcuni dettagli in questo problema su GitHub: https://github.com/Microsoft/TypeScript/issues/247 –

+0

@BrunoGrieder https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm I pacchetti sono davvero poco chiari. Ho letto pagine su pagine di commenti su problemi github ma non riesco a trovare una risposta a questa domanda davvero semplice. Con typescript> 1.6, se si desidera, ad esempio, scrivere una libreria che utilizza il modulo "inversify" (digitato), e quindi si desidera utilizzare anche l'inversify al di fuori della libreria. Come lo realizzi ?? – David

+0

@David Non ho mai usato inversify ma puoi trovare una libreria standard [qui] (http://github.com/wadahiro/typescript-library-boilerplate) e alcuni dettagli che ho scritto [lì] (http://stackoverflow.com/questions/34221594/best-way-to-share-a-js-object-tra-a-typescript-frontend-and-nodejs-backend/34225037 # 34225037) e in qualche modo simile vicino al fondo [lì] (http://stackoverflow.com/questions/35582275/using-an-external-typescript-library-within-a-typescript-internal-module/35588095#35588095) –

Problemi correlati